8

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

  1. 在控制面板中将 acpi 电源按钮按下操作设置为关机。
  2. 监听 WndProc 消息 WM_QUERYENDSESSION
  3. 收到问题后,完全没有记录:

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

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

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

谢谢。

4

2 回答 2

3

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

那么,你如何挂钩电源按钮按下?您需要编写设备驱动程序,特别是ACPI 过滤器驱动程序。我们现在正在对此进行调查。

于 2013-05-17T14:25:03.210 回答
0

我认为这是不可能的,除非您与您的硬件制造商交谈或硬连线开始按钮,以便它不会向处理此问题的硬件发送信号。你只能延迟它,但即使这样也不能给你 100% 的保证,我猜。

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

于 2013-05-01T20:56:33.530 回答