2013-06-01 1 views
2

J'écris un programme qui doit détecter quand les fenêtres sont fermées. Actuellement, j'utilise SetWindowsHookEx pour enregistrer un hook qui peut surveiller les messages de la fenêtre.L'Explorateur Windows ne reçoit pas WM_DESTROY. Comment puis-je détecter lorsque l'utilisateur ferme sa fenêtre d'exploration?

Je surveille les événements WM_DESTROY pour savoir quand les fenêtres ont été détruites. Cela fonctionne très bien pour la plupart des fenêtres avec Windows Explorer étant une exception notable. L'Explorateur Windows ne semble pas recevoir un événement WM_DESTROY lorsqu'il se termine (mais reçoit la plupart des autres événements intéressants).

Y a-t-il une raison pour laquelle Windows Explorer ne reçoit pas WM_DESTROY? Plus important encore, existe-t-il une autre méthode que je peux utiliser pour détecter lorsque l'explorateur Windows se termine à l'écoute de WM_DESTROY?

Merci!

J'utilise Windows 7 (pas sûr de la façon dont cette information pertinente est)

+0

Assez difficile de créer une réponse constructive à cette question. Bien sûr, WM_DESTROY * normalement * est envoyé lorsqu'une fenêtre est détruite. Mais la destruction de la fenêtre ne doit pas être normale. Rien n'est envoyé lorsque Windows détruit une fenêtre lorsque le processus se termine par exemple. Et il n'y a rien de normal chez Explorer, 18 ans de hacks appcompat pour que les extensions de shell populaires fonctionnent. Et l'option supplémentaire spéciale qu'Explorer a, l'option "Exécuter la fenêtre dans son propre processus". Beaucoup de choses à conspirer rendant votre code inefficace. –

+0

Cela signifie donc que je ne peux pas compter sur les messages WM_DESTROY en général? Dois-je vraiment faire quelque chose comme interroger EnumWindows à intervalles réguliers et vérifier quelles fenêtres ne sont plus là? – TomPeters

Répondre

2

Utilisez un crochet WH_CBT au lieu d'un crochet de message, et faites-le gérer HCBT_DESTROYWND notifications.

+0

J'ai juste essayé ceci et cela n'a pas fonctionné. Comme avec WM_DESTROY, je reçois des notifications HCBT_DESTROYWND à partir d'autres fenêtres, mais aucune à partir de l'Explorateur Windows. – TomPeters

+0

Ensuite, la fenêtre n'est pas détruite. Il est probablement juste caché pour une réutilisation ultérieure par le même processus explorer.exe. L'ouverture d'une nouvelle fenêtre Windows Explorer ne démarre pas toujours un nouveau processus explorer.exe. –

Questions connexes