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

时间:2013-04-23 21:25:52

标签: c# wndproc acpi windows-7-embedded

我正在使用自助服务终端风格的应用程序,我需要在按下电源按钮时控制PC的关闭/重启。多亏了这个post,我大约有90%的路在那里。

  1. 在控制面板中设置acpi电源按钮按下操作以关闭。
  2. 收听WndProc消息WM_QUERYENDSESSION
  3. 收到时发出完全未记录的内容:

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

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

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

    感谢。

2 个答案:

答案 0 :(得分:1)

在工作中收到一些好处,我能够直接将此问题提交给Microsoft支持。在我的第三个支持工程师,我基本上被告知在应用程序级别是不可能的。他认为,调用无证件CancelShutdown()"混淆"电源管理器或acpi驱动程序导致WM_QUERYENDSESSION消息延迟。由于CancelShutdown()没有记录,MS不愿意进一步调查。

那么,你怎么挂电源按钮?您需要编写设备驱动程序,特别是ACPI Filter Driver。我们现在正在研究这个问题。

答案 1 :(得分:0)

除非您与硬件制造商交谈或硬连接启动按钮,否则我认为不可能,因此它不会向处理此问题的硬件发送信号。 你只能推迟它,但即使这样我也不会给你100%的保证。

Windows 8.1(可能)会带来Kiosk模式。也许这就是你要找的东西; - )