2010-11-25 12 views
6

Quiero hacer una aplicación para interceptar todos los eventos de IU en todas las formas de mi aplicación y escribirlas en un registro. Esta información puede utilizarse para ver qué controles son los más utilizados, en qué orden, etc. El problema es que quiero que esto ocurra automáticamente, sin modificar las clases existentes.Evento de clic de interceptación para todos los controles en una aplicación en C# (WinForms)

Hice un prototipo que adjunta un método a un evento de clic para todos los controles en un formulario, pero ¿cómo se puede hacer esto para todas las formas? La reflexión necesita un objeto de destino al manipular eventos, pero solo se puede acceder fácilmente al formulario de inicio.

¿Hay alguna manera de enlazar el constructor de un objeto? Entonces podría "inyectar" mi método en todos los eventos de la nueva forma. O tal vez hay otra forma de hacer esto.

¡Gracias de antemano!

Respuesta

7

Puede instalar un message filter.

Un filtro de mensaje es un objeto que implementa IMessageFilter. WinForms llama a su método PreFilterMessage para cada mensaje que pasa a través del bucle de mensajes de su hilo. Esto es suficiente para monitorear la entrada del usuario a través de la aplicación (y le da la opción de manipularla).

1

En la API de Windows, esto se hace utilizando los ganchos locales (puede establecer el enganche del mouse local usando la función SetWindowsHookEx). Esta es la forma correcta de hacer su tarea. En C#, necesita usar P/Invoke para obtener acceso a SetWindowsHookEx.

Una tarea más sería hacer coincidir el HWND (identificador de Windows) con el control correspondiente de WinForms. Lea this article para saber cómo hacerlo (a través del mensaje WM_GETCONTROLNAME).

También vea this question que es un duplicado suyo.

0

Debe poder lograr lo que quiera con message filters - sin necesidad de P/Invoke directo para Win32-APIs.

Consulte la ayuda en la interfaz IMessageFilter para obtener más información.

Cuestiones relacionadas