2010-03-31 2 views
1

Il est difficile d'écrire un bon titre pour celui-ci.Comment obtenir des messages fenêtre ouverte/fermée/minimisée à partir d'une application native?

Je travaille sur une application WPF qui a besoin de connaître l'existence de toutes les autres fenêtres ouvertes sur le système. Je suis capable de le faire en appelant la méthode native EnumWindows très bien, et je peux appeler d'autres méthodes natives pour filtrer uniquement les fenêtres qui m'intéressent. Cela fonctionne bien.

Le problème que j'ai est que je veux savoir quand une fenêtre est ouverte ou fermée (et, idéalement, minimisée). Je peux le faire en interrogeant EnumWindows, mais je trouve que c'est assez lent, même si je le repousse à un autre thread.

Existe-t-il un meilleur moyen d'obtenir des notifications de fenêtre ouverte/fermée/minimisée? Gardez à l'esprit que ma connaissance du code non géré est assez limitée.

+0

Impossible? À partir d'ici: http://support.microsoft.com/kb/318804 À l'exception du hook de bas niveau WH_KEYBOARD_LL et du hook de bas niveau WH_KEUSE_LL, vous ne pouvez pas implémenter des hooks globaux dans Microsoft .NET Framework. Pour installer un point d'accès global, un point d'ancrage doit avoir une exportation de DLL native pour s'injecter dans un autre processus nécessitant une fonction valide et cohérente. Ce comportement nécessite une exportation DLL. Le .NET Framework ne prend pas en charge les exportations de DLL. Le code managé n'a pas de concept de valeur cohérente pour un pointeur de fonction, car ces pointeurs de fonction sont des proxies générés dynamiquement. –

+0

Certains progrès ici: http://pastebin.com/1q3qj5iY Si passer l'ID de thread en cours, je reçois des messages lorsque la fenêtre de l'application est mise au point et floue, mais j'ai besoin de messages de * toutes * les fenêtres. Passer 0 pour l'ID de thread pour obtenir tous les messages provoque SetWindowsHookEx pour renvoyer null. –

Répondre

1

Vous pouvez utiliser le crochet Windows pour ce type de chose.

Fondamentalement une fois configuré votre crochet, votre rappel sera appelé chaque fois que les messages que vous êtes intéressés sont appelés.

Il existe un bon exemple sur codeproject pour la définition de crochets globaux pour tout le système avec du code C#.
Remarque: Il existe un composant C++ non géré pour ce projet, mais vous n'avez pas besoin de travailler directement avec celui-ci.

+0

Merci, je vais creuser dans tout ça. Je peux au moins faire fonctionner l'échantillon. On dirait qu'il ne supporte que les événements souris/clavier prêts à l'emploi, et je ne sais pas si je peux l'étendre pour obtenir les messages dont j'ai besoin. Va chercher plus loin ... –

+0

On dirait que c'est un non-go. Seuls les hooks de souris et de clavier sont implémentés dans la bibliothèque, et l'extension nécessite de creuser dans le C++. Même si j'étais assez courageux pour le faire, je ne peux pas faire fonctionner le projet à partir de la source. Quelque chose à propos de l'appel géré SetUserHookCallback ne correspond pas à la signature native, mais je ne trouve même pas de documentation sur cette méthode. –

+0

@Josh Santangelo: Oui, en cours d'exécution de la démo ne vous oblige pas à aller dans le C++, mais pour faire ce que vous voulez faire, vous devez le faire. Vous utiliseriez ce projet comme point de départ. Ce n'est pas trivial mais très faisable. –

1
+0

J'utilise cela pour obtenir toutes les fenêtres au démarrage de l'application, mais il est trop lent à utiliser pour intercepter les changements dans la liste des fenêtres au moment de l'exécution . –

+0

Que diriez-vous de WM_WINDOWPOSCHANGING Message? – eschneider

+0

Je peux obtenir des messages de fenêtre du processus en cours, mais pas du système d'exploitation dans son ensemble. Exemple ici: http://pastebin.com/1q3qj5iY –

Questions connexes