如何控制电源按钮按下关机?

Mar*_*ark 7 c# wndproc acpi windows-7-embedded

我正在使用自助服务终端风格的应用程序,我需要在按下电源按钮时控制PC的关闭/重启.感谢这篇文章,我大约有90%的路在那里.

  1. 在控制面板中设置acpi电源按钮按下动作以关闭.
  2. 收听WndProc消息WM_QUERYENDSESSION
  3. 收到时发出完全无证件:

    [DllImport("user32.dll", SetLastError = true)]
    static extern int CancelShutdown();
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从WndProc返回并打开我自己的消息框,要求用户关机/重新启动或取消,并回复他们的操作.

如果我从任务栏进行启动/关闭,一切都很顺利(我可以尽快发出这些论文).第一次按下电源按钮时,一切都运行良好.在接下来的电源按钮按下时,我会在收到WM_QUERYENDSESSION消息之前看到一分钟左右的延迟.

是否有关于Windows发布ACPI事件的频率的设置或注册表项?我知道这不是硬件,因为在linux下,同一台机器会像我按下按钮一样快速启动ACPI事件.

谢谢.

Mar*_*ark 3

在工作中寻求一些帮助,我能够直接向 Microsoft 支持人员提出这个问题。在我的第三位支持工程师身上,我基本上被告知这在应用程序级别是不可能的。他认为,调用无证文件CancelShutdown()会“混淆”电源管理器或 acpi 驱动程序,从而导致WM_QUERYENDSESSION消息延迟。由于CancelShutdown()没有记录,MS 不愿意进一步调查。

那么,如何挂钩电源按钮按下操作呢?您需要编写一个设备驱动程序,特别是ACPI Filter Driver。我们现在正在调查此事。