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

本文关键字:按钮 关机 电源 何控制 控制 | 更新日期: 2023-09-27 18:10:28

我正在制作一个kiosk风格的应用程序,我需要在按下电源按钮时控制PC的关机/重启。多亏了这篇文章,我已经完成了90%的工作。

  1. 在控制面板中设置acpi电源按钮按下动作为关机。
  2. 监听WndProc消息WM_QUERYENDSESSION
  3. 当收到完全未记录的文件时:

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

如果我从任务栏开始/关闭(我可以尽可能快地发布论文),一切都很好。当我第一次按下电源按钮时,一切都很正常。在随后的电源按钮按下,虽然在我收到WM_QUERYENDSESSION消息之前我看到一分钟左右的延迟。

是否有一个设置或注册表项关于多久一次的窗口将发出一个ACPI事件?我知道这不是硬件的问题,因为在linux下,同一台机器会在我按下按钮时尽可能快地触发ACPI事件。

谢谢。

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

在公司找了一些人帮忙,我可以直接把这个问题交给微软的支持部门。在我的第三个支持工程师那里,我基本上被告知这在应用程序级别是不可能的。他认为调用未记录的CancelShutdown()会"混淆"电源管理器或acpi驱动程序,从而导致WM_QUERYENDSESSION消息延迟。由于CancelShutdown()是未记录的,MS不愿意进一步调查。

那么,你要如何让电源按钮按下呢?您需要编写一个设备驱动程序,特别是ACPI过滤器驱动程序。我们正在调查此事。

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

Windows 8.1将(可能)带来Kiosk模式。也许这就是你正在寻找的;-)