En un 2,005 aplicación de C++ MFC tendrá que añadir una ON_MESSAGE()
a su mapa de mensajes que buscan el mensaje WM_POWERBROADCAST
como en este ejemplo de Visual Studio:
BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument)
//{{AFX_MSG_MAP(CFrameworkWndDoc)
ON_WM_CHAR()
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd)
END_MESSAGE_MAP()
, entonces tendrá que añadir la función de controlador de mensajes junto con el cambio de definición de clase para declarar la función miembro para el controlador de mensajes para que pueda comprobar la variable wParam
para el tipo de mensaje, como en este esqueleto:
// Handle the WM_POWERBROADCAST message to process a message concerning power management
// such as going to Sleep or Waking Up.
LRESULT CFrameworkWndDoc::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam)
{
switch (wParam) {
case PBT_APMPOWERSTATUSCHANGE:
TRACE0("PBT_APMPOWERSTATUSCHANGE received\n");
break;
case PBT_APMRESUMEAUTOMATIC:
TRACE0("PBT_APMRESUMEAUTOMATIC received\n");
break;
case PBT_APMRESUMESUSPEND:
TRACE0("PBT_APMRESUMESUSPEND received\n");
break;
case PBT_APMSUSPEND:
TRACE0("PBT_APMSUSPEND received\n");
break;
}
return 0;
}
lo que tengo se En es que una prueba con lo anterior en una aplicación que se ejecuta en Windows 7, que se inició en el depurador y luego manualmente hacer que mi PC que ejecuta la aplicación a dormir voy a ver el siguiente mensaje:
PBT_APMSUSPEND received
Luego, cuando el PC se reinicia y me registro en lo que voy a ver en la ventana de salida de un depurador dos mensajes uno tras otro:
PBT_APMRESUMESUSPEND received
PBT_APMRESUMEAUTOMATIC received
Todo lo que he encontrado hasta el momento indica que usted no tiene ninguna indicación de si usted está saliendo de un estado de Suspensión o de Hibernación. Todavía estoy investigando más sobre lo que se debe hacer al suspender o reanudar el manejo de archivos y dispositivos. He visto indicaciones de que los identificadores de archivo a los puertos COM ya no son válidos después de reanudar. Tampoco estoy seguro acerca de las interfaces con otros procesos, por ejemplo, las conexiones de bases de datos.
Además de los estados de administración de energía Sleep e Hibernate estándar, Microsoft ha introducido el Connected Standby power state with Windows 8 and 8.1 que tiene algunas ramificaciones de diseño de aplicaciones según el tipo de aplicación.
Las aplicaciones de escritorio generalmente no requieren trabajo adicional para integrarse con el modo de espera conectado .
El moderador de actividad de escritorio (DAM) es el componente de Windows que pausa todas las aplicaciones de escritorio y acelera el tiempo de ejecución de los servicios del sistema de durante el modo de espera conectado.El propósito de DAM es mantener la compatibilidad básica del software con las aplicaciones y servicios existentes de , pero mitigar su impacto en la duración de la batería durante el reposo.
Windows impide que las aplicaciones de escritorio se ejecuten durante cualquier parte de espera activa después de que se completa la fase DAM. Windows permite que los servicios del sistema de terceros se ejecuten en modo acelerado después de completando la fase DAM. En este modo, un servicio de terceros puede ejecutar durante no más de un segundo de la hora del reloj de pared cada 30 segundos.
The Art of Graceful Application Suspension by Lynn Merrill de Intel tiene alguna información sobre el manejo de los diferentes tipos de mensajes de Windows asociados con la administración de energía en Windows sin embargo, es la fecha 2005 por lo que no todo el material puede pertenecer a Windows después de Windows XP. Hay al menos un mensaje que ya no se usa en la secuencia de mensajes descrita en este documento como el que comienza con Windows Vista, el mensaje PBT_APMQUERYSUSPEND
que se usó para solicitar si Windows podía dejar de usar la aplicación. La función SetThreadExecutionState()
ahora se usa para indicar que un hilo no se puede interrumpir con un cambio al estado de Suspensión o Hibernación. Consulte las respuestas en stackoverflow Can't catch sleep suspend messages (winxp) para obtener detalles sobre los cambios de mensajes de estado de la administración de energía.
¿Tiene un ejemplo de código que funciona, por favor? (intenté algunos ejemplos en línea, pero no parecen activar el evento) –