Как отследить нажатия клавиш в Python с помощью pyHook, если окно программы не в фокусе?

Собственно, главная цель - управлять программой на Python, висящей в трее, с помощью клавиш на клавиатуре. Подсмотрел метод отслеживания здесь - Python: как отловить сочетания клавиш? Подредактировал код под себя:
import win32api
import win32con
import pythoncom
import pyHook

def OnKeyboardEvent(event):
if event.Key=='F4' and event.MessageName == 'key down':
print ("Клавиша нажалась")
x, y = win32api.GetCursorPos()
print (x,y)
return True

hm = pyHook.HookManager()
hm.KeyAll = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

В итоге, если окно с IDLE в фокусе - все работает как часы. В противном случае при нажатии нужной клавиши (F4) вылезает ошибка:
TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'
Подскажите, как исправить?
  • Вопрос задан
  • 8417 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Canckt Автор вопроса
Можно ли как-то по-другому реализовать управление программой, висящей в трее, с помощью клавиш? Чтобы ВСЕ нажатия детектировались
Ответ написан
Комментировать
TomasHuk
@TomasHuk
К сожалению есть такая проблема. Как я понял если в имени окна есть символы кириллицы, то выдает эту ошибку. Нашел форк pyHook pyhook_py3k, где написано следующее:

Fixed unicode decoding bug of window title. This bug may cause crashing on exit randomly. Usually with console output:

TypeError: MouseSwitch() takes exactly 9 arguments (1 given)
or

TypeError: KeyboardSwitch() takes exactly 9 arguments (1 given)

Не знаю как это исправлено в том форке, ведь в файле HookManager.py все еще осталась функция KeyboardSwitch(self, msg, vk_code, scan_code, asci..., которая и выдает эту ошибку.
Пока у меня не получилось запустить без ошибки, но возможно нужно еще подумать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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