2010-12-20 192 views
5

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

我做了我的研究,但只发现了监测睡眠事件的建议。我想要更具体地回答关闭盖子的问题。

有没有人有建议?

谢谢!

+0

我看着这个的年龄,但从来没有找到一个解决方案。在linux上很容易阅读 - 但在Windows(最高xp)上,盖子开关与电源管理相关联,而电源管理又与用户身份验证相关。我到了需要编写设备驱动程序的地步,并停在那里。 – sje397 2010-12-20 03:36:09

+3

http://stackoverflow.com/questions/3355606/detect-laptop-lid-closure-and-opening – Samuel 2010-12-20 03:47:41

+0

@Samuel - 出色的发现。 – sje397 2010-12-20 03:54:00

回答

4

当盖子关上时,您可以注册通知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。这在Platform SDK的wdm.h中定义。

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

+0

很好的答案。有关如何在实践中使用这些东西的非常小的具体示例,请查看[LapLock](https://github.com/dechamps/laplock/)。 – 2016-08-13 09:30:15

2

问题涉及到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

相关问题