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.
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. –
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. –