在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