2010-12-20 28 views
5

私はラップトップの蓋を閉じるイベントをインターセプトする方法を探しています。 Windows 7では、電源管理機能を使用して、蓋を閉じたときに希望の動作を選択することができます。だから、蓋が閉じられたときに窓が知る方法がなければならない。Windowsでノートパソコンの蓋を閉じるイベントをキャプチャしますか?

私は自分の研究をしましたが、睡眠事象を監視するための示唆が見つかりました。私は、蓋を閉じることにのみ対応するために、より具体的になりたいと思います。

誰かに提案がありますか?

ありがとうございます!

+0

私は年齢のため、このに見えたが、解決策を見つけたことはありません。 linuxでは読みやすいですが、ウィンドウ(xpまで)では、リッドスイッチは電源管理に結びついています。電源管理は、ユーザーの認証情報と結びついています。私はデバイスドライバを書く必要があったところに来て、そこで止まった。 – sje397

+3

http://stackoverflow.com/questions/3355606/detect-laptop-lid-closure-and-opening – Samuel

+0

@Samuel - excellent find。 – sje397

答えて

4

蓋が閉まっている場合は、RegisterPowerSettingNotificationで通知することができます。

AnswerLid閉じるアクションの変更通知あなたがふたを閉じるアクションの変更のためのコールバックを登録することができますVistaでは

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

。これは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/)をご覧ください。 –

2

質問は、GUID_LIDCLOSE_ACTIONではなくGUID_LIDSWITCH_STATE_CHANGEを参照します。

GUID_LIDCLOSE_ACTIONモニター蓋が閉じているとき、ユーザは、電力動作を変更した場合([コントロールパネル] - > [電源設定 - 開閉蓋が何を選択してください>)

あなたはオープン/クローズ蓋のイベントを監視する場合GUID_LIDSWITCH_STATE_CHANGEに登録する必要があります。

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); 
    ... 
} 

とサービス制御ハンドラで:私はそれをWindowsサービスを使用

/** 
* 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

関連する問題