56 votes

Comment simuler l'arrêt de Windows pour le débogage ?

J'ai un problème avec mon application lorsque Windows se ferme - mon application ne se termine pas correctement, ce qui entraîne l'affichage de la fenêtre de fin de tâche. Comment puis-je utiliser le débogueur pour voir ce qui se passe ?

Existe-t-il un moyen d'envoyer le(s) message(s) d'arrêt de Windows à mon application pour qu'elle pense que Windows s'arrête, afin que je puisse voir exactement comment elle se comporte ?

66voto

dkl Points 1031

Il existe un outil appelé Restart Manager (rmtool.exe) dans les outils de test de logo de Microsoft pour Windows, qui peut être utilisé pour envoyer des messages d'arrêt et de redémarrage à un processus. Les outils de test de logo peuvent être téléchargés ici :

http://download.microsoft.com/download/d/2/5/d2522ce4-a441-459d-8302-be8f3321823c/LogoToolsv1.0.msi

Vous pouvez alors simuler l'arrêt de votre processus :

rmtool.exe -p [PID] -S

où [PID] est l'identifiant du processus. Selon le document "Vista Logo Certification Test Cases",

Les messages d'arrêt du gestionnaire de redémarrage sont :

a. WM_QUERYENDSESSION avec LPARAM = ENDSESSION_CLOSEAPP(0x1) : Les applications GUI doivent répondre (TRUE) immédiatement pour se préparer à un redémarrage.

b. WM_ENDSESSION avec LPARAM = ENDSESSION_CLOSEAPP(0x1) : L'application doit se fermer dans les 5 secondes (20 secondes pour les services).

c. CTRL_SHUTDOWN_EVENT : Les applications de la console doivent s'arrêter immédiatement.

0 votes

Génial ! (Je ne l'ai pas encore essayé - si quelqu'un l'utilise et peut donner son avis, ce serait génial).

8 votes

Votre lien est cassé. Les outils de test du logo faisaient partie de l'ancien programme de logo du logiciel client Windows 7. Ces outils ne figurent plus sur le site Web de Microsoft. Ils semblent avoir été remplacés par le kit de certification des applications Windows, qui fait partie du programme de certification des applications de bureau Windows 10. Le kit ne comprend pas rmtool.exe seulement rmlogotest.exe . J'ai déjà écrit un peu sur rmlogotest.exe ailleurs ; pour lire ce que j'ai écrit, suivez le lien suivant ce lien .

0 votes

rmlogotest.exe envoie des messages à votre application, et je soupçonne que ce sont les mêmes messages que ceux que rmtool.exe avait l'habitude d'envoyer, mais je n'ai pas vérifié pour être sûr.

8voto

Jon Tackabury Points 10999

Je crois que lorsque Windows s'arrête, il envoie un "WM_QueryEndSession" à toutes les applications. Pour simuler un arrêt de Windows, vous pouvez créer une petite application qui envoie un PostMessage avec ce message à votre application et voir ce qui se passe. Windows peut envoyer d'autres messages pour fermer votre application (comme WM_CLOSE), mais chaque fois que votre application reçoit le message "WM_QueryEndSession", cela signifie que votre application est sur le point d'être fermée.

1 votes

De même, WM_QueryEndSession est suivi (avec le feu vert des applications qui le reçoivent) par WM_EndSession.

0 votes

Excellent - merci pour la clarification JMD. Je me suis dit qu'il devait y avoir un message supplémentaire, mais je n'étais pas sûr de ce que c'était.

0 votes

Y a-t-il des utilitaires utiles que je peux utiliser pour envoyer de tels messages au lieu d'en créer un moi-même ?

3voto

TarmoPikaro Points 11

Cela peut être fait en utilisant rmlogotest.exe outil. Voir le lien suivant :

https://superuser.com/questions/959364/on-Windows-how-can-i-gracefully-ask-a-running-program-to-terminate#1154058

Si vous utilisez WPF, vous pouvez alors gérer un événement supplémentaire :

        Application.SessionEnding += Application_SessionEnding;

où vous pouvez définir e.Cancel = true; pour pouvoir interrompre la fermeture de l'application.

Je pense rmlogotest.exe utilise un délai d'attente de 5 secondes, puis il vous dira que LOGO Validation FAILED .

Si vous mettez une sorte de boîte de message de confirmation dans votre application - vous obtenez un échec car pour l'utilisateur final, cela prendra probablement plus de 5 secondes pour répondre.

Je suppose que du point de vue de Windows, si 5 secondes se sont écoulées, il veut redémarrer de toute façon - et si l'utilisateur final n'a pas sauvegardé son document / travail - alors Windows s'attend à le copier ailleurs peut-être.

De mon point de vue (en tant que développeur d'applications), il est acceptable d'avoir des défaillances. LOGO Validation FAILED L'utilisateur peut décider de lui-même s'il va tuer mon application après 5 secondes et perdre son document ou s'il va sauvegarder le document et fermer mon application manuellement.

Si vous devez diffuser WM_QUERYENDSESSION il doit alors être envoyé via SendMessage à toutes les fenêtres du processus en cours. Un exemple de code de démarrage peut être trouvé ici :

https:/

Mais il n'envoie que WM_ENDSESSION vous devez utiliser WM_QUERYENDSESSION à la place et ajoute l'énumération Windows du processus donné.

Liens connexes :

2voto

Rami A. Points 3207

SendMessage peut être utilisé pour envoyer des messages de fenêtre avec n'importe quels paramètres à une fenêtre.

Très utile pour le débogage et les tests.

  1. Envoyer le message WM_QUERYENDSESSION con LPARAM = ENDSESSION_CLOSEAPP . L'application doit renvoyer 1 (VRAI) pour indiquer qu'elle est prête à s'arrêter et à redémarrer.

  2. Envoyer le message WM_ENDSESSION avec LPARAM = ENDSESSION_CLOSEAPP L'application doit s'arrêter dans le délai spécifié.

1voto

Bit Destroyer Points 1226

Vous pourriez utiliser le SystemEvents.SessionEnding qui est déclenché lorsqu'un utilisateur se déconnecte ou s'arrête. Soyez prudent lorsque vous l'utilisez, car la disponibilité de certaines ressources n'est pas garantie. Par exemple, mon application avait besoin de toucher un serveur lorsqu'il s'éteignait pour pointer un utilisateur (une application de chronométrage), mais la carte réseau est parfois déjà désactivée lorsque cet événement se produit. Comme vous ne faites que du nettoyage, cela devrait fonctionner correctement.

0 votes

Comment simuler un arrêt pour essayer ce que vous avez écrit ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X