Перехват события щелчка для всех элементов управления в приложении в C # (WinForms) - PullRequest
6 голосов
/ 25 ноября 2010

Я хочу создать приложение для перехвата всех событий пользовательского интерфейса во всех формах моего приложения и записи их в журнал. Эти данные можно затем использовать, чтобы увидеть, какие элементы управления используются чаще всего, в каком порядке и т. Д. Проблема в том, что я хочу, чтобы это происходило автоматически, без изменения существующих классов.

Я создал прототип, который присоединяет метод к событию click для всех элементов управления в форме, но как это можно сделать для всех форм? Отражение нуждается в целевом объекте при манипулировании событиями, но только форма запуска может быть легко доступна.

Есть ли способ зацепить конструктор объекта? Тогда я мог бы «внедрить» свой метод во все события новой формы. Или, может быть, есть другой способ сделать это.

Заранее спасибо!

Ответы [ 4 ]

7 голосов
/ 25 ноября 2010

Вы можете установить фильтр сообщений .

Фильтр сообщений - это объект, который реализует IMessageFilter.WinForms вызывает ваш метод PreFilterMessage для каждого сообщения, которое проходит через цикл сообщений вашего потока.Этого достаточно, чтобы контролировать ввод пользователя через приложение (и дает вам возможность манипулировать им).

1 голос
/ 25 ноября 2010

В Windows API это делается с помощью локальных перехватчиков (вы можете установить перехват локальной мыши с помощью функции SetWindowsHookEx ).Это правильный способ выполнить вашу задачу.В C # вам нужно использовать P / Invoke, чтобы получить доступ к SetWindowsHookEx.

Еще одна задача - сопоставить HWND (дескриптор окна) с соответствующим элементом управления WinForms.Прочтите эту статью , чтобы узнать, как это сделать (через сообщение WM_GETCONTROLNAME).

Также см. этот вопрос , который является вашим дубликатом.

0 голосов
/ 25 ноября 2010

Вы сможете достичь желаемого с помощью фильтров сообщений - Не требуется прямой P / Invoke для Win32-API!

См. Справку наIMessageFilter интерфейс для получения дополнительной информации.

0 голосов
/ 25 ноября 2010

Думаю, вам придется работать с сообщениями API Win32.

Вот небольшой пример в форме учебника .

...