Перехват события щелчка для всех элементов управления в приложении в C# (WinForms)
Я хочу сделать приложение, чтобы перехватывать все события пользовательского интерфейса во всех формах моего приложения и записывать их в журнал. Эти данные можно затем использовать, чтобы увидеть, какие элементы управления используются чаще всего, в каком порядке и т. Д. Проблема в том, что я хочу, чтобы это происходило автоматически, без изменения существующих классов.
Я создал прототип, который присоединяет метод к событию click для всех элементов управления в форме, но как это можно сделать для всех форм? Отражение нуждается в целевом объекте при манипулировании событиями, но только форма запуска может быть легко доступна.
Есть ли способ зацепить конструктор объекта? Тогда я мог бы "внедрить" свой метод во все события новой формы. Или, может быть, есть другой способ сделать это.
Заранее спасибо!
4 ответа
Вы можете установить фильтр сообщений.
Фильтр сообщений - это объект, который реализует IMessageFilter
, WinForms вызывает ваш PreFilterMessage
метод для каждого сообщения, которое проходит через цикл сообщений вашего потока. Этого достаточно, чтобы контролировать ввод пользователя через приложение (и дает вам возможность манипулировать им).
В Windows API это делается с помощью локальных перехватчиков (вы можете установить перехват локальной мыши с помощью функции SetWindowsHookEx). Это правильный способ сделать вашу задачу. В C# вам нужно использовать P/Invoke, чтобы получить доступ к SetWindowsHookEx.
Еще одна задача - сопоставить HWND (дескриптор окна) с соответствующим элементом управления WinForms. Прочтите эту статью, чтобы узнать, как это сделать (через сообщение WM_GETCONTROLNAME).
Также посмотрите этот вопрос, который является дубликатом вашего.
Я думаю, вам придется работать с сообщениями API Win32.
Вы должны быть в состоянии достичь того, что вы хотите, с помощью фильтров сообщений - прямой P/Invoke для Win32-API не требуется!
Смотрите помощь на IMessageFilter
интерфейс для получения дополнительной информации.