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

在windows中捕获笔记本电脑盖关闭事件?,windows,Windows,我正在寻找一种截获笔记本电脑盖关闭事件的方法。在windows 7中,电源管理允许我在盖子关闭时选择所需的行为。因此,一定有一种方法可以让窗户知道盖子何时关闭 我做了研究,但只找到了监控睡眠事件的建议。我想更具体地只回应盖关闭 有人有什么建议吗 谢谢 当盖子关闭时,您可以使用RegisterPowerSettingNotification注册通知 应答关闭操作更改通知 在Vista中,当盖子关闭动作更改时,您可以注册回调。这是通过调用RegisterPowerSettingNotificati

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

我做了研究,但只找到了监控睡眠事件的建议。我想更具体地只回应盖关闭

有人有什么建议吗


谢谢

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

应答关闭操作更改通知

在Vista中,当盖子关闭动作更改时,您可以注册回调。这是通过调用RegisterPowerSettingNotification完成的(有关详细信息,请参阅)。您感兴趣的此电源设置的GUID是GUID\u LIDCLOSE\u操作。这在平台SDK的wdm.h中定义

注册后,WM_POWERBROADCAST将发送到您的应用程序,wParam设置为PBT_POWERSETTINGCHANGE。只要盖关闭动作的值发生变化,就会发送此事件。LPRAM包含一个指向POWERBROADCAST\u设置结构(请参阅)的指针,其中包含有关设置更改的信息


问题涉及GUID\u LIDSWITCH\u STATE\u更改为GUID\u LIDCLOSE\u操作

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

如果要监视盖子关闭/打开事件,需要注册GUID\U LIDSSWITCH\U STATE\U 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表示打开

详情如下:

我对此研究了很久,但始终没有找到解决方案。在linux上它很容易阅读,但在windows(直到xp)上,lid开关与电源管理相关联,而电源管理又与用户身份验证相关联。我到了需要编写设备驱动程序的地步,就停在那里。回答得好。关于如何在实践中使用这些东西的一个非常小的具体例子,请看。