pygame захватить события клавиатуры, когда окно не в фокусе

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

Таким образом, я хочу, чтобы мои события с джойстиком игнорировались до тех пор, пока нажата клавиша клавиатуры. Я наткнулся на метод pygame.key.get_pressed() но это, похоже, работает только, если окно pygame находится в фокусе. Я хочу, чтобы этот скрипт работал в фоновом режиме. Должен ли я начинать использовать события non-pygame для прослушивания клавиатуры или есть способы отслеживать аналоговые события клавиатуры с событиями джойстика, которые распознаются в фоновом режиме, через pygame?

2 Solutions collect form web for “pygame захватить события клавиатуры, когда окно не в фокусе”

Я ожидаю, что pygame создаст собственную «песочницу», так что трудно обнаружить вход из-за его окна. Ваш предыдущий вопрос указывает, что вы также используете модуль win32api . Мы можем использовать это для обнаружения глобальных нажатий клавиш.

Правильный способ обнаружения нажатия клавиш в глобальном масштабе – настроить крючок клавиатуры с помощью SetWindowsHookEx . К сожалению, win32api не раскрывает этот метод, поэтому нам придется использовать менее эффективный метод.

Метод GetKeyState может использоваться для определения того, находится ли ключ вниз или вверх. Вы можете постоянно проверять состояние ключа, чтобы узнать, нажал ли он или выпустил его в последнее время.

 import win32api import time def keyWasUnPressed(): print "enabling joystick..." #enable joystick here def keyWasPressed(): print "disabling joystick..." #disable joystick here def isKeyPressed(key): #"if the high-order bit is 1, the key is down; otherwise, it is up." return (win32api.GetKeyState(key) & (1 << 7)) != 0 key = ord('A') wasKeyPressedTheLastTimeWeChecked = False while True: keyIsPressed = isKeyPressed(key) if keyIsPressed and not wasKeyPressedTheLastTimeWeChecked: keyWasPressed() if not keyIsPressed and wasKeyPressedTheLastTimeWeChecked: keyWasUnPressed() wasKeyPressedTheLastTimeWeChecked = keyIsPressed time.sleep(0.01) 

Предупреждение: как и в любом цикле «while True Sleep, а затем Check», этот метод может использовать больше циклов процессора, чем эквивалент «установить метод обратного вызова и ожидания». Вы можете увеличить продолжительность периода ожидания, чтобы улучшить это, но обнаружение ключа займет больше времени. Например, если вы спите в течение полной секунды, это может занять до одной секунды, когда вы нажимаете клавишу и когда джойстик отключен.

когда ваше окно получает или теряет фокус, вы получаете ACTIVEEVENT . Это атрибуты gain и state говорят вам, какое состояние вы приобрели или потеряли. Решение easisest, вероятно, должно было бы поймать эти события в вашем основном цикле событий и использовать их для отслеживания погоды, с которой вы фокусируетесь. Затем вы можете просто игнорировать события джойстика, если у вас нет фокуса.

Python - лучший язык программирования в мире.