如何拦截 Windows 中物理电源按钮的按下?

Posted

技术标签:

【中文标题】如何拦截 Windows 中物理电源按钮的按下?【英文标题】:How can I intercept the push of the physical power button in Windows? 【发布时间】:2013-01-13 16:02:41 【问题描述】:

有什么方法可以拦截按下物理电源按钮的事件以对此事件做出反应?即:

Push button -> My program catches the event -> My program performs action.

我的目标是编写一个 C# 程序/服务来监听电源按钮事件,然后打开“问我该怎么做”关机对话框(就像它在 Windows XP 时代所做的那样)。

【问题讨论】:

Detecting windows shutdown event 的可能重复项 @Jason:不是重复的。 OP 询问是否拦截按下电源按钮(以便它执行除关闭以外的其他操作),而另一个问题是关于检测系统正在关闭。 如果不是这两个的重复,那么你必须这样做:sevenforums.com/customization/… 我知道您可以将 CallNtPowerInformation 与 SystemPowerPolicyAc(和/或 Dc)一起使用来禁用电源按钮,使其不执行任何操作;为此,您需要将PowerButton.Action 设置为PowerActionNone 并将PowerButton.EventCode 设置为POWER_FORCE_TRIGGER_RESET。相同的 API 提供了执行程序的选项,但我不清楚如何使用它。你也许可以通过实验来解决它,或者搜索关键字POWER_LEVEL_USER_NOTIFY_EXEC可能会给你一些线索。 这是“问我该怎么做”对话框:link 【参考方案1】:

你可以使用 SystemEvents.SessionEnding Event

但是我不确定如果按下电源按钮这是否会起作用,当用户尝试注销或关闭系统时会发生此事件。

【讨论】:

【参考方案2】:

我可以从理论上向您解释:该按钮(在大多数系统上与关机相关的按钮)在“电源选项”下有一个选项,您可以在其中指定按下电源按钮时要执行的操作。 ..

正是您正在寻找的那个 ACTION 事件被窗口绑定到按钮,然后实例化了关闭事件。有一些程序可以剖析和监视 Windows 变量和调用,您必须使用其中一个来找出并拦截/覆盖它。

【讨论】:

以上是关于如何拦截 Windows 中物理电源按钮的按下?的主要内容,如果未能解决你的问题,请参考以下文章

检测笔记本电脑上的电源按钮按下

如何在角度6的按下按钮更改事件?

如何在 Windows Phone 中更改 RadioButton 的按下状态

按钮停止上的按下(波纹)动画

Xamarin.Forms 监听Button的按下释放事件

菜鸟的Xamarin.Forms前行之路——按钮的按下抬起事件的监控(可扩展至其他事件)