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
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
http://stackoverflow.com/questions/3355606/detect-laptop-lid-closure-and-opening – Samuel
@Samuel - excelente descubrimiento. – sje397