在Windows中捕获笔记本电脑盖关闭事件?

时间:2010-12-20 03:33:30

标签: windows

我正在寻找拦截笔记本电脑盖关闭事件的方法。在Windows 7中,电源管理允许我在盖子关闭时选择所需的行为。因此,窗户必须有一种方式可以知道盖子何时关闭。

我做了我的研究,但只发现了监测睡眠事件的建议。我想更具体一点,只回应关闭盖子。

有人有建议吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以使用RegisterPowerSettingNotification关闭盖子时注册通知。

AnswerLid关闭操作更改通知

http://social.msdn.microsoft.com/Forums/en-US/tabletandtouch/thread/0bbf90be-9322-47fb-bfa4-016b57211b3a

  

在Vista中,您可以注册Lid Close Action更改时的回调。这可以通过调用RegisterPowerSettingNotification来完成(有关详细信息,请参阅http://msdn2.microsoft.com/en-us/library/aa373196.aspx)。您感兴趣的此电源设置的GUID是GUID_LIDCLOSE_ACTION。这在Platform SDK的wdm.h中定义。

     

注册后,WM_POWERBROADCAST将被发送到您的应用程序,并将wParam设置为PBT_POWERSETTINGCHANGE。只要盖子关闭操作的值发生变化,就会发送此事件。 lParam包含指向POWERBROADCAST_SETTING结构的指针(请参阅http://msdn2.microsoft.com/en-us/library/aa372723.aspx),其中包含有关设置更改的信息。

答案 1 :(得分:4)

问题是指GUID_LIDSWITCH_STATE_CHANGE而不是GUID_LIDCLOSE_ACTION。

GUID_LIDCLOSE_ACTION监控用户在盖子关闭时是否更改电源行为(控制面板 - >电源设置 - >选择关闭盖子的功能)

如果要监视盖子关闭/打开的事件,则需要注册GUID_LIDSWITCH_STATE_CHANGE。我用它来做Windows服务:

int ServiceMain(int argc, char** argv)
{
    serviceStatusHandle = RegisterServiceCtrlHandlerExA(serviceName, (LPHANDLER_FUNCTION_EX) ServiceControlHandler, 0);
    ...
    lidcloseRegHandle = RegisterPowerSettingNotification(serviceStatusHandle, &GUID_LIDSWITCH_STATE_CHANGE, DEVICE_NOTIFY_SERVICE_HANDLE);
    ...
}

在服务控制处理程序中:

/**
* Event handler for windows service.
*/
void WINAPI ServiceControlHandler(DWORD controlCode, DWORD evtype, PVOID evdata, PVOID Context)
{
    switch (controlCode)
    {...
         case SERVICE_CONTROL_POWEREVENT:
         WriteToLog("Service Control: SERVICE_CONTROL_POWEREVENT builds and fwd the msg");
         msg.control = SERVICE_CONTROL_POWEREVENT;
         msg.event_type = (int) evtype;
         msg.event_data = evdata;
     ...
    }
}

evtype是PBT_POWERSETTINGCHANGE,在evdata中你记录了事件:0表示已关闭,1表示已打开。

此处有更多详情: https://msdn.microsoft.com/en-us/library/aa372723.aspx https://msdn.microsoft.com/en-us/library/hh769082(v=vs.85).aspx