wxPython: перехват ключевых событий по всему миру

Есть кое-что, что я пытаюсь сделать с wxPython, и я не могу понять, как. (У меня Windows 7, и я в порядке с решением только для Windows.)

Я хочу поймать ключевые события во всем мире. Это означает события нажатия клавиш, нажатия клавиш и символов. (Я пытаюсь построить что-то вроде AHK в Python.)

Теперь я знаю, что wxPython допускает глобальные горячие клавиши, но это неудовлетворительно, потому что я хочу получить все события, включая key up, key down и char. Как я могу это сделать?

Я попытался использовать pyHook, который почти работал, за исключением случаев, когда события char не реализованы. События с чаром кажутся хитрыми, и я хочу знать, как их запечатлеть во всем мире. (т.е. во всех приложениях.) Я также в порядке с решениями, которые используют другие инструменты, кроме wxPython. (За исключением отдельной графической оболочки, я доволен использованием wxPython для графического интерфейса, просто инструментами для захвата событий char.)

4 ответа

Решение

Извините, но вы не можете перехватить события WM_CHAR непосредственно из исполняемого файла Python. Вам нужно будет написать собственную DLL-библиотеку Windows для перехвата WH_GETMESSAGE, а затем отдельно уведомить ваш процесс Python о том, что клавиша была нажата.

Как вы можете видеть здесь, способ перехвата WM_CHAR заключается в перехвате событий, считанных GetMessage(), с помощью ловушки WH_GETMESSAGE. К сожалению, любая глобальная перехват для этого сообщения должна быть в состоянии выполняться в контексте любого процесса и поэтому должна быть реализована как DLL (как это предусмотрено документами API). Это означает, что вы не можете сделать это внутри процесса Python. Это также описано в архивах Python win32 здесь.

Это означает, что вам нужно написать собственную DLL для перехвата сообщений, а затем использовать вашу любимую форму IPC (например, отправить сообщение в другое окно) для передачи любых интересных событий вашему процессу Python.

Если вы действительно хотите привязки Python для AutoHotKey, вы можете использовать pyahk, чтобы сделать это для вас.

Бесплатная программа чтения с экрана с открытым исходным кодом для Windows, NVDA, реализует эту функцию. Может быть, посмотрите, как они этого добиваются?

Источник: winInputHook.py

PyWin32 имеет SetWindowsHook, который может работать в соответствии с этим потоком. Возможно, вы сможете использовать ctypes, хотя я пока не нашел хороших примеров.

Я также нашел этот проект, который выглядит многообещающим:

Возможно, это не идеальное решение, но вы пытались включить код Pygame?

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

Из этого туториала вы узнаете, как получить ввод с клавиатуры. Кроме того, в Pygame есть некоторые мелкие вещи, но вам не нужно ничего этого делать для нажатия клавиш.

http://www.nerdparadise.com/tech/python/pygame/basics/part6/

И вот список кодов клавиш, которые использует Pygame.

https://www.pygame.org/docs/ref/key.html

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