2010-12-20 8 views
5

Estoy buscando una manera de interceptar el evento de cierre de la tapa del portátil. En Windows 7, la administración de energía me permite seleccionar un comportamiento deseado cuando la tapa está cerrada. Entonces, debe haber una forma en que Windows sabe cuando la tapa está cerrada.¿Captura el evento de cierre de la tapa del portátil en Windows?

Hice mi investigación, pero solo encontré sugerencias para monitorear el evento de sueño. Me gustaría ser más específico para responder solo al cierre del párpado.

¿Alguien tiene alguna sugerencia?

Gracias!

+0

me miraron a esto para las edades, pero nunca encontraron una solución. En Linux es fácil de leer, pero en Windows (hasta xp), el interruptor de la tapa está vinculado a la administración de energía, que a su vez está vinculada a la autenticación del usuario. Llegué al punto en que necesitaba escribir un controlador de dispositivo y me detuve allí. – sje397

+3

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

+0

@Samuel - excelente descubrimiento. – sje397

Respuesta

4

Puede registrarse para recibir notificaciones cuando la tapa se cierre con RegisterPowerSettingNotification.

AnswerLid Cerrar Acción notificación de cambio

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

En Vista, puede registrarse para obtener una devolución de llamada para cuando la tapa Cerrar cambios de acción. Esto se hace llamando a RegisterPowerSettingNotification (vea http://msdn2.microsoft.com/en-us/library/aa373196.aspx para más detalles). El GUID para esta configuración de energía que le interesa es GUID_LIDCLOSE_ACTION. Esto se define en wdm.h en Platform SDK.

Una vez registrado, se enviará un WM_POWERBROADCAST a su aplicación con wParam configurado en PBT_POWERSETTINGCHANGE. Este evento se envía cada vez que cambia el valor de la acción de cierre de la tapa. El lParam contiene un puntero a una estructura POWERBROADCAST_SETTING (ver http://msdn2.microsoft.com/en-us/library/aa372723.aspx) que contiene información sobre el cambio de configuración.

+0

Buena respuesta. Para un pequeño ejemplo concreto de cómo usar esto en la práctica, eche un vistazo a [LapLock] (https://github.com/dechamps/laplock/). –

2

La pregunta se refiere a GUID_LIDSWITCH_STATE_CHANGE no a GUID_LIDCLOSE_ACTION.

monitores GUID_LIDCLOSE_ACTION si el usuario cambia el comportamiento de alimentación cuando la tapa está cerrando (Panel de control -> Configuración de energía -> Elija lo que hace el cierre la tapa)

Si desea supervisar el caso de la tapa de apertura/cierre , debe registrarse en GUID_LIDSWITCH_STATE_CHANGE. Lo usé un servicio de 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); 
    ... 
} 

Y en controlador de control de servicio:

/** 
* 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 es PBT_POWERSETTINGCHANGE y en evdata usted tiene el evento registrado: 0 para cerrado y 1 para abrir.

Más detalles aquí: https://msdn.microsoft.com/en-us/library/aa372723.aspx https://msdn.microsoft.com/en-us/library/hh769082(v=vs.85).aspx

Cuestiones relacionadas