4 votes

Win32 : Obtenir un message de notification de la fermeture/expiration d'une autre application

Mon application doit surveiller toutes les autres applications en cours d'exécution sur le système. Existe-t-il un moyen de recevoir une notification à la sortie de chaque application exe ?

Les méthodes que j'ai pu trouver :

1) Utilisez les fonctions PSAPI pour obtenir la liste des exes en cours d'exécution à intervalles fréquents. A chaque sondage, comparez avec la liste précédente pour trouver quelle application/processus a quitté. Inconvénient : Nécessite une interrogation constante, prend du temps CPU.

2) Définir un crochet global pour le message WM_CLOSE : En utilisant ceci, je serais capable d'obtenir une notification lorsqu'une application est fermée par le bouton de fermeture de la barre de titre.

Désavantage : (-)Toutes les applications ne génèrent pas un message WM_CLOSE (Ex : Total Video Player Exe) (-)Si l'application a été fermée par le menu ou le bouton "Exit" (ex : File->Exit), je ne peux pas capturer ce message.

Y a-t-il un autre meilleur moyen que j'ai manqué ? Veuillez me conseiller.

10voto

Serge - appTranslator Points 11916
  1. Obtenir une liste de PIDs utilisant PSAPI.
  2. Ensuite, il faut maîtriser chaque processus en utilisant OpenProcess() .
  3. Utilice WaitForMultipleObjects() pour être signalé quand l'un des processus sort.

2voto

Stefan Points 29091

Vous pouvez essayer le RegisterShellHookWindow () et filtre les messages HSHELL_WINDOWCREATED et HSHELL_WINDOWDESTROYED.

Bien sûr, cela ne vous permettra d'être informé que des applications qui ont une fenêtre.

1voto

armanali Points 875

J'ai récemment rencontré ce problème et j'ai trouvé une solution que je voulais partager avec vous tous. Tout est correct de la façon dont nous devrions obtenir le handle du processus. Au lieu de WaitForSingleOBject cependant, je recommanderais d'utiliser la fonction RegisterWaitForSingle object. Avec cette fonction, vous donnez une fonction de rappel et chaque fois que le processus se termine, votre fonction de rappel sera appelée. C'est mieux que d'appeler WaitForSingleObject dans un thread. En effet, si vous appelez WaitForSingleObject dans votre code, celui-ci attendra que le processus se termine. Voici un exemple de la façon de l'appeler :

RegisterWaitForSingleObject(&waitHandle, processHandle, ProcessTerminatedCallback, param, INFINITE, WT_EXECUTEONLYONCE);

Où : [out]waitHandle - nouveau handle créé pour vous. Veuillez noter que vous ne pouvez pas utiliser ce handle pour appeler CloseHandle, mais vous pouvez l'attendre, si vous le souhaitez.

[in] processHandle - handle du processus que vous êtes censé obtenir vous-même

[ProcessTerminatedCallback - fonction de rappel qui sera appelée à la fin du processus.

[Param - Paramètre LPVOID qui sera transmis à la fonction de rappel.

[INFINITE - attend infiniment ou pendant un temps déterminé, consultez MSDN pour plus d'informations.

[WM_EXECUTEONLYONCE - n'appellera la fonction de rappel qu'une seule fois. Consultez MSDN pour plus d'informations.

-1voto

> Y a-t-il un autre meilleur moyen que j'ai manqué ?

Oui, beaucoup. Voir sur Groupe Win32 (notifications du système, sans crochet)

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