Перехват события щелчка для всех элементов управления в приложении в 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 интерфейс для получения дополнительной информации.

Другие вопросы по тегам