Intercettare evento click per tutti i controlli in un app in C # (WinForms)
-
28-09-2019 - |
Domanda
voglio fare una domanda di intercettare tutti gli eventi dell'interfaccia utente in tutte le forme della mia applicazione e per scriverli in un registro. Questo può essere usato dati rispetto per vedere quali controlli sono i più utilizzati, in quale ordine, ecc Il problema è che io voglio che questo accada automaticamente, senza modificare le classi esistenti.
Ho fatto un prototipo che si attacca un metodo per un evento click per tutti i controlli in un modulo, ma come può questo essere fatto per tutte le forme? Riflessione deve un oggetto target quando manipolando gli eventi, ma solo la forma di avvio può essere facilmente accessibili.
C'è un modo per collegare il costruttore di un oggetto? Poi ho potuto "iniettare" il mio metodo a tutti gli eventi del nuovo modulo. O forse c'è un altro modo per farlo.
Grazie in anticipo!
Soluzione
È possibile installare una href="http://msdn.microsoft.com/en-us/library/system.windows.forms.application.addmessagefilter.aspx" rel="noreferrer"> filtro dei messaggi .
Un filtro dei messaggi è un oggetto che implementa IMessageFilter
. WinForms chiama il metodo PreFilterMessage
per ogni messaggio che passa attraverso ciclo di messaggi del thread. Questo è sufficiente per monitorare input dell'utente attraverso l'applicazione (e ti dà la possibilità di manipolare esso).
Altri suggerimenti
In Windows API questo viene fatto utilizzando hook locali (è possibile impostare hook locale mouse utilizzando SetWindowsHookEx funzione). Questo è il modo corretto di fare il vostro compito. In C # è necessario utilizzare P / Invoke al fine di ottenere l'accesso a SetWindowsHookEx.
Un altro compito sarebbe adatta al HWND (handle finestre) a corrispondenti controllo WinForms. Leggi questo articolo per sapere come fare questo (tramite un messaggio WM_GETCONTROLNAME).
Si veda anche questa domanda che è un duplicate del tuo.
Si dovrà lavorare con i messaggi API del Win32, immagino.
Si dovrebbe essere in grado di ottenere quello che vuoi con - senza P diretta / Invoke per Win32 API richieste
, vedere la guida sulla IMessageFilter
interfaccia per maggiori informazioni.