То, как добавить систему “рычаг окон”, чтобы быть уведомленным относительно окна того, чтобы быть, создало/активировало?

Eclipse CDT имеет функцию «Метод реализации», которая делает именно это (по одному методу за раз). Существует также функция «Создать геттеры и сеттеры», которая также генерирует соответствующий код в теле функций.

5
задан Gishu 11 June 2009 в 07:00
поделиться

2 ответа

Я думаю, что у вас возникли проблемы из-за того, что вы пытаетесь реализовать функцию перехвата на C #. На основе документации pinvoke.net на SetWindowsHookEx () говорится, что вы не можете этого сделать - подключаемая процедура должна находиться в неуправляемой DLL. В противном случае это загрузит вашу DLL во все запущенные процессы с помощью цикла сообщений, что, в свою очередь, приведет к загрузке и запуску CLR в каждом процессе. Это не только займет много времени, но и внедрение среды CLR во все процессы, вероятно, не лучшая идея. Кроме того, что произойдет, если у процесса уже есть запущенная среда CLR, которая отличается от той, для которой была создана ваша DLL?

Лучшим подходом было бы переместить этот код в неуправляемую DLL C ++, и используйте какое-то межпроцессное взаимодействие для отправки данных, перехваченных вашей подключаемой процедурой, обратно в ваше приложение.

Обновление

Сначала (и это, вероятно, не вызывает вашей проблемы), почему вы вызываете LoadLibrary () , чтобы получить HINSTANCE вашей DLL? Вероятно, было бы лучше вызвать GetModuleHandle () , поскольку ваша DLL уже загружена.

Что касается того, почему ваша подключаемая процедура никогда не вызывается - как вы это проверили? Поскольку вы подключаете все потоки графического интерфейса пользователя в системе, это означает, что ваша DLL должна быть загружена во все процессы графического интерфейса. Скорее всего, вы не увидите результатов вызова wprintf () , потому что у других процессов нет окна консоли для отображения вывода.

Чтобы убедиться, что ваша DLL загружена правильно, используйте программу, которая перечисляет библиотеки DLL, загруженные процессом (мне нравится Process Explorer ). Вы можете использовать Find | Пункт меню Find Handle или DLL для поиска имени вашей DLL - он должен отображаться во всех процессах с циклом сообщений.

После того, как вы проверили, что ваша DLL загружена, чтобы увидеть, вызывается ли ваша ловушка, вы можете прикрепить отладчик для другого процесса (например, Блокнота), а затем установите точку останова в вашей функции перехвата. Это должно срабатывать каждый раз, когда сообщение отправляется на ловушку CBT. Если вы не хотите использовать отладчик, вы можете изменить вызовы с wprintf () на OutputDebugString () и запустить такую ​​утилиту, как DebugView , чтобы отслеживать результаты.

Наконец, поскольку ваша функция-перехватчик вызывается в контексте другого процесса, ваша переменная m_HookHandle там не будет действительна. Вы должны сохранить его в сегменте общих данных , чтобы все загруженные экземпляры вашей DLL имели одинаковое значение.

5
ответ дан 14 December 2019 в 04:46
поделиться

Наконец-то это удалось. Написал это как сообщение в блоге на случай, если это кому-то понадобится в будущем.

3
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: