如何检测电源button事件,并拒绝在笔记本电脑上的Windows 7

在Windows XP上,当按下笔记本电脑的电源button时,我可以检测事件。 APMQUERYSUSPEND事件的条件是[控制面板 – >电源选项 – >系统设置 – >当我按下电源button – >睡眠]选项必须更改为'睡眠'。

MainFrm::OnPowerBroadcast(WPARAM wParam, LPARAM lParam) 

{

  switch (wParam) { case PBT_APMQUERYSUSPEND: // Ask question whether to power off or not // If not, return BROADCAST_QUERY_DENY return BROADCAST_QUERY_DENY; } 

但从Windows 7,我没有任何线索来检测事件。 基于Windows 7,APMQUERYSUSPEND事件被删除。 即使我尝试SetThreadExecutionState API来阻止closures,它不会工作。 http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa372716(v=vs.85).aspx

按下电源button时是否有任何想法发现事件?

谢谢。

根据微软的文档,一旦启动睡眠事件就不可能中断睡眠事件。 这里有一个关于Windows Vista / 7电源控制的非常丰富的介绍。 还有一种方法来捕获睡眠按钮事件。 在我的例子中,我将使用C#语法

首先,调用RegisterHotKey(this.Handle, 0, 0x4000, 0x5F) API的RegisterHotKey(this.Handle, 0, 0x4000, 0x5F)来挂接睡眠键。 然后重写你的程序的WndProc方法(取决于你使用的语言和环境,有不同的方法来做),并听取热键消息312h。 只要您收到它,请从kernel32.dll API调用SetThreadExecutionState(EXECUTION_STATE.ES_AWAYMODE_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS)以防止Windows启动睡眠事件。 经过一段时间(如果您希望系统能够再次睡眠),您可以调用SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)

请注意,如果已经启动了睡眠过程,则SetThreadExecutionState将不起任何作用,这就是为什么上述不可能为电源按钮做的事情,而据我所知,电源按钮不能被挂住(如果有人真的知道某种方式那么,请让我知道!) 。 这也可能是为什么SetThreadExecutionState不适合你。

常数是:

  ES_CONTINUOUS = 0x80000000, ES_SYSTEM_REQUIRED = 1, ES_AWAYMODE_REQUIRED = 0x00000040