2008-10-23 14 views

Respuesta

3

Puede supervisar Win32_PowerManagementEvent WMI caso

+0

¿Tiene un ejemplo de código que funciona, por favor? (intenté algunos ejemplos en línea, pero no parecen activar el evento) –

3

No estoy seguro de la frecuencia con que desea controlar esto, pero si escribe un servicio en .NET puede anular ServiceBase, establecer CanHandlePowerEvent en verdadero, y luego se le notificarán los cambios de energía a través de la enumeración PowerBroadcastStatus.

+0

Gracias por mencionar 'CanHandlePowerEvent', ese fue mi problema. – n0ne

3

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.

+0

+1 No sabía sobre el modo de espera conectado y me preguntaba por qué mi servicio de Windows se comportaba mal en una tableta. ¡Muchas gracias! –

0

Puede suscribirse a NetworkChange.NetworkAvailabilityChanged y NetworkChange.NetworkAddressChanged.

Por lo general, comienzo un temporizador de dos segundos para que pueda reanudar las comunicaciones de red después de estar en modo de suspensión cuando se agota el tiempo de espera.

Cuestiones relacionadas