Перехватить событие CLICK для всех элементов управления в приложении в C # (WinForms)

StackOverflow https://stackoverflow.com/questions/4279732

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Еще одна задача будет соответствовать HWND (рукоятку Windows) для соответствующих управлений WinForms. Читать эта статья Для того, как это сделать (через сообщение WM_GetControlname).

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

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

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

Вы должны быть в состоянии достичь того, с кем вы хотите Сообщение фильтры - Нет Direct P / Invoke к Win32-API-API требуется!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top