La interceptación de evento de clic para todos los controles en una aplicación en C # (WinForms)
-
28-09-2019 - |
Pregunta
Quiero hacer una solicitud para interceptar todos los eventos de interfaz de usuario en todas las formas de mi solicitud y para escribirlos en un registro. Esta lata de datos que puede utilizar para ver qué controles son los más utilizados, en qué orden, etc. El problema es que quiero que esto suceda de forma automática, sin necesidad de modificar las clases existentes.
Me hizo un prototipo que se fija un método para un evento de clic para todos los controles en un formulario, pero ¿cómo se puede hacer esto para todas las formas? Reflexión necesita un objeto de destino en la manipulación de eventos, pero sólo el formulario de inicio se puede acceder fácilmente.
¿Hay una manera de conectar el constructor de un objeto? Entonces pude "inyectar" mi método en todos los eventos de la nueva forma. O tal vez hay otra manera de hacerlo.
Gracias de antemano!
Solución
Se puede instalar un filtro de mensajes de href="http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter.aspx" rel="noreferrer"> .
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 controlar la entrada del usuario a través de la aplicación (y le da la opción de manipular a ella).
Otros consejos
En la API de Windows esto se realiza mediante ganchos locales (Se puede fijar el gancho del ratón local usando SetWindowsHookEx función). Esta es la forma correcta de hacer su tarea. En C # es necesario utilizar P / Invoke con el fin de obtener acceso a SetWindowsHookEx.
Uno más tarea sería para que coincida con el HWND (mango ventanas) a que corresponde el control de Windows Forms. Leer este artículo de cómo hacer esto (a través de mensajes WM_GETCONTROLNAME).
También ver esta pregunta que es una duplicado de la suya.
tendrá que trabajar con mensajes de API de Win32, supongo.
debe ser capaz de lograr lo que quiere con los filtros de mensajes ! - P no directa / Invoke para Win32 API requerida
Consulte la ayuda en la IMessageFilter
interfaz para más información.