2010-12-20 13 views
5

Ich bin auf der Suche nach einer Möglichkeit, das Schließen des Laptopdeckels abzufangen. In Windows 7 erlaubt mir die Energieverwaltung, ein gewünschtes Verhalten zu wählen, wenn der Deckel geschlossen ist. Es muss also ein Weg sein, wie Windows weiß, wenn der Deckel geschlossen ist.Capturing Laptop-Deckel schließen Veranstaltung in Windows?

Ich habe meine Nachforschungen gemacht, aber nur Vorschläge gefunden, um das Schlafereignis zu überwachen. Ich möchte spezifischer sein, um nur auf Schließen des Deckels zu reagieren.

Hat jemand einen Vorschlag?

Danke!

+0

Ich sah in die für Alter, fanden aber nie eine Lösung. Unter Linux ist es einfach zu lesen - aber auf Windows (bis zu xp) ist der Deckel-Schalter an die Energieverwaltung gebunden, die wiederum an Benutzer-Auth-Zeug gebunden ist. Ich kam an den Punkt, an dem ich einen Gerätetreiber schreiben musste - und blieb dort stehen. – sje397

+3

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

+0

@ Samuel - ausgezeichnete finden. – sje397

Antwort

4

Sie können sich registrieren, wenn der Deckel mit RegisterPowerSettingNotification geschlossen ist.

AnswerLid Schließen Aktion Änderungsmitteilung

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

In Vista Sie einen Rückruf für, wenn der Deckel schließen Aktion Änderungen registrieren. Dies geschieht durch Aufruf von RegisterPowerSettingNotification (Details siehe http://msdn2.microsoft.com/en-us/library/aa373196.aspx). Die GUID für diese Energieeinstellung, an der Sie interessiert sind, ist GUID_LIDCLOSE_ACTION. Dies ist in wdm.h im Platform SDK definiert.

Einmal registriert, wird ein WM_POWERBROADCAST an Ihre Anwendung gesendet, wobei wParam auf PBT_POWERSETTINGCHANGE gesetzt wird. Dieses Ereignis wird immer dann gesendet, wenn sich der Wert für die Schließaktion ändert. Das lParam enthält einen Zeiger auf eine POWERBROADCAST_SETTING-Struktur (siehe http://msdn2.microsoft.com/en-us/library/aa372723.aspx), die Informationen zur Änderung der Einstellung enthält.

+0

Gute Antwort. Für ein sehr kleines konkretes Beispiel, wie man dieses Zeug in der Praxis benutzt, werfen Sie einen Blick auf [LapLock] (https://github.com/dechamps/laplock/). –

2

Die Frage verweist auf GUID_LIDSWITCH_STATE_CHANGE nicht auf GUID_LIDCLOSE_ACTION.

GUID_LIDCLOSE_ACTION überwacht, ob der Benutzer das Leistungsverhalten ändert sich, wenn der Deckel (Systemsteuerung -> Energieeinstellungen -> Wählen Sie, was das Schließen des Deckels der Fall ist) schließt

Wenn Sie das Ereignis des Deckels Schließen/Öffnen überwachen möchten , müssen Sie sich für GUID_LIDSWITCH_STATE_CHANGE registrieren. Ich benutzte es, einen Windows-Dienst:

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

Und in Dienststeuerungshandler:

/** 
* 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 ist PBT_POWERSETTINGCHANGE und in evdata haben Sie das Ereignis protokolliert: 0 für geschlossene und 1 für eröffnet.

Weitere Details hier: https://msdn.microsoft.com/en-us/library/aa372723.aspx https://msdn.microsoft.com/en-us/library/hh769082(v=vs.85).aspx