2010-01-27 4 views
3

J'essaie de suivre les fenêtres visibles de tous les processus en cours d'exécution. Mon programme interagit avec ces fenêtres et plus vite il peut les détecter, mieux c'est. Mon but est de déplacer les fenêtres visibles à un certain endroit sur l'écran avant même qu'ils dessinent dans la position par défaut si c'est possible. Sinon, je veux les déplacer le plus rapidement possible après leur création.Comment exécuter du code chaque fois qu'une fenêtre d'application (autres processus) s'ouvre?

En ce moment j'énumère à travers les fenêtres visble en utilisant EnumWindows (p/invoqué à partir de user32.dll) dans une boucle avec un retard aussi faible entre les itérations que je peux justifier.

Je cherche une méthode pour m'accrocher à 'quelque chose' qui me permettra d'attendre qu'un événement d''ouverture de fenêtre' se déclenche au lieu de poller constamment.

Existe-t-il des méthodes pour y parvenir?

Répondre

5

Vous avez besoin de la fonction API SetWindowsHookEx(), en définissant un hook WH_SHELL. Le rappel reçoit une notification HSHELL_WINDOWCREATED lorsqu'une nouvelle fenêtre de premier niveau est créée.

Ceci est un hook global, vous ne pouvez pas écrire le code pour ce hook en C#. Il nécessite une DLL qui peut être injectée dans un processus, le CLR ne peut pas être initialisé correctement pour prendre en charge le code managé. Vous aurez besoin d'une DLL non managée pour faire le travail, this project en offre un.