Comment puis-je savoir quand Windows entre / sort du mode veille ou veille prolongée?

Est-il possible de s’abonner à un événement Windows qui se déclenche lorsque Windows entre ou sort de l’état Veille ou Veille prolongée?

J’ai besoin que mon application soit mise au courant lorsque l’ordinateur s’endort pour faire un peu de nettoyage et éviter les problèmes de synchronisation au sortir du sumil.

Microsoft.Win32.SystemEvents.PowerModeChanged événement vous donnera cette information. Cet événement est disponible dans toutes les variantes du framework .NET publié par Microsoft jusqu’à présent.

Dans .NET, utilisez l’événement PowerModeChanged . Dans Win32, utilisez le message WM_POWERBROADCAST .

Vous pouvez surveiller l’ événement WMI Win32_PowerManagementEvent

Vous ne savez pas à quelle fréquence vous souhaitez surveiller cela, mais si vous écrivez un service dans .NET, vous pouvez remplacer ServiceBase, définir CanHandlePowerEvent sur true, puis vous serez averti des modifications de l’alimentation via l’énumération PowerBroadcastStatus.

Dans une application Visual Studio 2005 C ++ MFC, vous devrez append un ON_MESSAGE() à votre mappage de messages à la recherche du message WM_POWERBROADCAST , comme dans cet exemple:

 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() 

Ensuite, vous devrez append la fonction de gestionnaire de messages avec le changement de définition de classe pour déclarer la fonction membre du gestionnaire de messages afin que vous puissiez vérifier la variable wParam pour le type de message comme dans ce squelette:

 // 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; } 

Ce que j’ai vu, c’est qu’un test utilisant ce qui précède dans une application exécutée sur Windows 7 qui est démarré dans le débogueur, puis que je fais manuellement mon PC exécutant l’application sur Sleep, verra le message suivant:

 PBT_APMSUSPEND received 

Ensuite, lorsque le PC est redémarré et que je me connecte, je vois dans la fenêtre de sortie du débogueur deux messages l’un après l’autre:

 PBT_APMRESUMESUSPEND received PBT_APMRESUMEAUTOMATIC received 

Tout ce que j’ai trouvé jusqu’à présent indique que vous n’avez aucune indication si vous sortez d’un état de veille ou d’hibernation. Je continue à faire des recherches sur ce qui doit être fait lors de la suspension ou lors de la reprise en tant que manipulations de fichiers et de périphériques. J’ai vu des indications que les descripteurs de fichiers vers les ports COM ne sont plus valides après la reprise. Je ne suis pas sûr non plus des interfaces avec d’autres processus pour les connexions de firebase database d’instance.

En plus des états standard de gestion de l’alimentation Sleep et Hibernate, Microsoft a introduit l’ état de veille Connecté avec Windows 8 et 8.1, qui a certaines ramifications de conception d’applications selon le type d’application.

Les applications de bureau ne requièrent généralement aucun travail supplémentaire pour s’intégrer au serveur de secours connecté.

Le module DAM (Desktop Activity Moderator) est le composant Windows qui interrompt toutes les applications du bureau et limite le temps d’exécution des services système tiers pendant la veille connectée. L’objective du DAM est de maintenir la compatibilité logicielle de base avec les applications et services existants, mais d’atténuer leur impact sur la durée de vie de la batterie pendant le sumil.

Windows empêche les applications de bureau de s’exécuter pendant toute la durée de la veille connectée une fois la phase DAM terminée. Windows permet aux services système tiers de s’exécuter en mode limité après la fin de la phase DAM. Dans ce mode, un service tiers peut fonctionner pendant une seconde au maximum toutes les 30 secondes.

L’art de la suspension d’application gracieuse par Lynn Merrill d’Intel contient des informations sur la gestion des différents types de messages Windows associés à la gestion de l’alimentation sous Windows. Cependant, tous les documents peuvent concerner Windows après Windows XP. Il y a au moins un message inutilisé dans la séquence de messages décrite dans ce document comme commençant par Windows Vista le message PBT_APMQUERYSUSPEND qui était utilisé pour demander si une application pouvait suspendre n’est plus utilisé par Windows. La fonction SetThreadExecutionState() est maintenant utilisée pour indiquer qu’un thread ne peut pas être interrompu par une modification de l’état Sleep ou Hibernate. Afficher les réponses dans stackoverflow Impossible de lire les messages de suspension de veille (winxp) pour plus de détails sur les modifications apscopes aux messages d’état de la gestion de l’alimentation.

Vous pouvez vous abonner à NetworkChange.NetworkAvailabilityChanged et NetworkChange.NetworkAddressChanged.

Je démarre généralement un minuteur de deux secondes pour que je puisse reprendre les communications réseau après avoir été en mode veille lorsqu’il a expiré.