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

Bea*_*ear 5 windows

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

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

有没有人有建议?

谢谢!

小智 6

问题是指 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);
    ...
}
Run Code Online (Sandbox Code Playgroud)

在服务控制处理程序中:

/**
* 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;
     ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Sam*_*eff 5

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

AnswerLid 关闭操作更改通知

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

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

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