【问题标题】:How to control power button press shutdown?如何控制电源按钮按下关机?
【发布时间】:2013-04-23 21:25:52
【问题描述】:

我正在开发一个 kiosk 风格的应用程序,我需要在按下电源按钮时控制 PC 的关机/重启。感谢post,我已经完成了大约 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 事件。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 请注意,如果您按住电源按钮,我不会尝试挂钩硬件关闭。我想要点击按钮时发生的 acpi 事件关闭。操作系统当然能够挂钩该事件并优雅地关闭,为什么我不能呢?
      • 马克你在这个问题上有什么进展吗?我在嵌入式 Windows 7 上遇到了同样的问题。
      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多