Comment détecter si Windows est en cours d'arrêt ou de redémarrage
Je sais que lorsque Windows est en cours d'arrêt, il envoie un WM_QUERYENDSESSION message à chaque application. Cela rend plus facile à détecter lorsque Windows est en cours d'arrêt. Cependant, est-il possible de savoir si l'ordinateur va hors tension ou est-ce qu'il va redémarrer après l'installation de Windows s'est arrêté.
Je ne suis pas particulièrement optimiste, compte tenu de la documentation MSDN a ceci à dire à propos de WM_QUERYENDSESSION
: "...il n'est pas possible de déterminer l'événement qui s'est produit," mais l'accumulation des spécificités de stackoverflow ne cesse de m'étonner.
OriginalL'auteur Andrew Garrison | 2009-06-11
Vous devez vous connecter pour publier un commentaire.
De ici:
Un peu d'un rond-point solution, mais il devrait faire l'affaire.
-1 Parce que la réponse est incomplète et spécifique à l'Explorateur Windows. Il semble également être supprimé dans Windows 7.
Il fonctionne bien sous windows xp, mais pas sous Windows7
OriginalL'auteur Eric Petroelje
Dans Windows 7 (et probablement aussi dans Vista /8 /Server), vous pouvez utiliser le système d'événements de savoir si Windows est en cours d'arrêt (et d'éteindre l'ordinateur) ou tout simplement en redémarrant. Chaque fois qu'un arrêt/redémarrage est engagé (par tous les moyens - en cliquant sur le bouton dans le menu de Démarrage, ou par programmation), Windows 7 écrit un ou deux événements dans le journal Système, source de USER32, l'ID d'événement 1074. Vous pouvez voir ces événements enregistrés si vous ouvrez l'Observateur d'Événements à partir des Outils d'Administration (filtre le journal Système pour voir uniquement l'ID de 1074). La description (message) de ces événements contient le type d'arrêt. Donc, vous pourriez analyser la description de l'événement le plus récent de ce type (après l'arrêt a été lancé), recherche pour le mot nécessaire (arrêt, redémarrage/réinitialisation).
Je n'ai pas essayer de voir le type d'arrêt écrit dans l'événement lors de l'utilisation du bouton d'alimentation pour normalement arrêt de Windows (j'ai l'habitude de désactiver cette fonction), mais sur certains site suggère qu'il déclare un "power off" le type au lieu de "shutdown" - afin de vérifier it out, si vous avez besoin d'être sûr. Ou il suffit de regarder pour un "reboot" de type si il ne l'est pas, puis un "shutdown" de type est supposé.
Dans Windows XP, à partir de mon expérience, un événement 1074 est enregistré que si l'arrêt ou le redémarrage se fait par programmation (par exemple, au cours d'un programme d'installer ou d'utiliser le shutdown.exe de l'utilité). Afin de ne pas enregistrer les arrêts de production initiée à partir de l'interpréteur de commandes (Explorer), mais peut-être vous pouvez combiner cette méthode avec la lecture de la valeur de registre proposé dans une autre réponse. Aussi, gardez à l'esprit que, dans WinXP le message de l'événement 1074 contient le mot "redémarrer" quel que soit le type réel de l'arrêt, de sorte que vous devriez regarder dans le "Type d'Arrêt:" sur le terrain, qui sera l'état "arrêt" ou "redémarrer".
À cet égard, un ID d'événement 1073 est enregistré à chaque fois que Windows ne parvient pas à arrêter/redémarrer pour une raison quelconque (par exemple, si une application ne permet pas à l'arrêter, comme une réponse à WM_QUERYENDSESSION). Dans ce cas, le message contiendra également des mots comme "arrêt", "reboot" ou "power off" - dans WinXP. Pour Win7 ce type d'événement est moins utile dans notre cas, puisqu'il ne fera aucune différence entre l'arrêt et le redémarrage. Mais pour WinXP - si vous avez seulement besoin d'intercepter l'arrêt ou le redémarrage, d'effectuer certaines actions, puis continuer le correspondant d'arrêt ou de redémarrage du processus, il doit fonctionner comme prévu.
OriginalL'auteur Danath
Une astuce qui fonctionne habituellement est de piéger
WM_ENDSESSION
et de l'enregistrer. Maintenant, gardez une trace du temps. Si le système revient dans un délai peroid (5 minutes). Alors que c'était un reboot, pas un arrêt.Idée: Si le système revient à moins de 5 minutes, il ne vraiment importe si l'utilisateur a cliqué sur "arrêt" ou "redémarrage"?
Si vous avez vraiment besoin pour détecter un arrêt (et la seule raison pour laquelle je pense que vous auriez besoin pour ce faire est si vous êtes en fonction sur un obscur comportementale logiciel de différence entre un arrêt vs un redémarrage), vous pourriez étudier
API hooking
deExitWindowsEx
et fonctions connexes, mais je ne recommande pas cette approche. Repenser si vous avez vraiment besoin de détecter directement.Avec modernes de gestion de l'alimentation ACPI: le Sommeil, Hibernate, Réveil par le réseau, et ainsi de suite. La définition de reboot (ou démarrage à chaud) est de plus difficile à définir. Ce que la plupart des gens veulent dire par reboot (ou assez proche), c'est que le système n'était pas dans un état normal pour un très court laps de temps.
OriginalL'auteur unixman83
Expérimentale éventuelle solution pour Windows7 pourrait être la suivante. (Je ne suis pas sûr si cela fonctionne bien avec les autres localisations, donc je dirais que c'est une solution de contournement)
L'exemple suivant est un exemple de XML qui est écrit dans le journal des événements lorsqu'un PC est redémarré:
OriginalL'auteur conceptacid