Question

Je veux faire une demande d'intercepter tous les événements de l'interface utilisateur dans toutes les formes de mon application et de les écrire dans un journal. Cela peut être que de données utilisées pour voir quels contrôles sont les plus utilisés, dans quel ordre, etc. Le problème est que je veux que cela se produise automatiquement, sans modifier les classes existantes.

J'ai fait un prototype qui attache une méthode à un événement de clic pour toutes les commandes sous une forme, mais comment cela peut-il être fait pour toutes les formes? La réflexion a besoin d'un objet cible lors de la manipulation d'événements, mais seulement la forme de démarrage peut être facilement accessible.

Est-il possible de brancher le constructeur d'un objet? Ensuite, je pouvais « injecter » ma méthode dans tous les événements de la nouvelle forme. Ou peut-être il y a une autre façon de le faire.

Merci à l'avance!

Était-ce utile?

La solution

Vous pouvez installer un filtre de message .

Un filtre de message est un objet qui implémente IMessageFilter. WinForms appelle votre méthode de PreFilterMessage pour chaque message qui passe par la boucle de message de votre fil. Cela suffit pour surveiller l'entrée d'utilisateur dans l'application (et vous donne la possibilité de le manipuler).

Autres conseils

Dans Windows API cela se fait à l'aide de crochets locaux (vous pouvez définir le crochet de la souris locale en utilisant SetWindowsHookEx fonction). Ceci est la bonne façon de faire votre tâche. En C #, vous devez utiliser P / Invoke afin d'avoir accès à SetWindowsHookEx.

Une autre tâche serait de correspondre à la HWND (poignée de fenêtres) pour le contrôle WinForms correspondant. Lire cet article pour savoir comment faire (par message WM_GETCONTROLNAME).

Voir aussi cette question qui est dupliquer la vôtre.

Vous devez travailler avec les messages API Win32, je suppose.

Voici un petit exemple sous la forme de tutoriel .

Vous devriez être en mesure de réaliser ce que vous voulez avec filtres de message - pas directement P / Invoke pour Win32 API nécessaires

Consultez l'aide sur le IMessageFilter l'interface pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top