Python ctypes: функция обратного вызова SetWindowsHookEx никогда не вызывается - PullRequest
4 голосов
/ 23 июня 2011

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

Насколько я могу судить, способ обнаружения этих событий заключается в использовании перехватчиков сообщений, как описано здесь: http://msdn.microsoft.com/en-us/library/ms632589%28v=vs.85%29.aspx

Мне даже посчастливилось найти пример, который обращается к функции SetWindowsHookEx из Python. (Этот конкретный пример использует сигналы мыши, но я могу просто изменить константы для прослушивания различных сообщений). http://www.python -forum.org / pythonforum / viewtopic.php? Е = 2 & т = 11154

Однако приведенный выше пример не работает. Функция обратного вызова никогда не вызывается, независимо от моих щелчков мыши, и средний щелчок мыши не приводит к завершению программы.

Пример взят из 2009 года (до Windows 7?), Хотя я не знаю, в этом ли проблема.

Итак, мой вопрос: может ли кто-нибудь 1. выяснить, почему код работает, или 2. подсказать мне другой способ добиться того, что я делаю (предпочтительно в Python, хотя я перейду на другие языки, если потребуется) .

Редактировать: Можно ли делать то, что я хочу, с WMI? Я плохо знаю WMI, но знаю, что у него очень хороший интерфейс Python.

1 Ответ

2 голосов
/ 26 июня 2011

За исключением WH_KEYBOARD_LL и WH_MOUSE_LL, хуки Windows должны быть реализованы в DLL, которую Windows внедряет в каждый процесс приложения.Поэтому вы не можете просто реализовать обратный вызов в вашей программе и ожидать, что Windows его запустит.

Я могу придумать два способа решения этой проблемы:

  1. ЗаписьDLL на C или C ++, которая реализует процедуру подключения и уведомляет вашу основную программу через некоторую форму межпроцессного взаимодействия.Затем загрузите эту DLL в основную программу и передайте ее дескриптор модуля и процедуру подключения, реализованную в этой DLL, в SetWindowsHookEx.

  2. Функция SetWinEventHook может дать вам то, что вы хотите.Хуки WinEvent могут быть реализованы в вашей основной программе.

...