Получить входные данные без фокуса в Python/Pygame?

Я создаю для себя небольшое приложение, чтобы иметь возможность отображать ввод с клавиатуры и отображать их в раскладке джойстика, например:

Текущий вид моего приложения

Это само по себе отлично работает, пока окна Pygame сфокусированы, моя проблема в том, что я не могу сфокусировать это все время, на самом деле у него никогда не будет фокуса, потому что в любом случае я буду использовать OBS для потоковой передачи или я буду использовать мой эмулятор, и pygame не обнаруживает ввод, который находится вне окна. Есть ли способ заставить python или pygame прочитать весь ввод, сделанный на компьютере??? Я ударяю стену здесь. Заранее спасибо!!


person NyxTheShield    schedule 22.07.2015    source источник
comment
Pygame не может сделать это за вас с помощью своей обработки событий, поскольку он прослушивает только события окна. Что вы ищете для низкоуровневых хуков, посмотрите здесь ">Применение низкоуровневых перехватов клавиатуры с помощью Python и SetWindowsHookExA для примера.   -  person sloth    schedule 22.07.2015


Ответы (2)


Используйте 1_

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

Однако вам понадобится другой способ выхода, так как вы не сможете переместить мышь за пределы окна дисплея.

person Luke Borowy    schedule 25.07.2015
comment
Вы говорите о set_grab()? Не работает, пробовал уже. - person NyxTheShield; 26.07.2015
comment
Да, я был. Извините за опечатку. Жаль, что это не работает. - person Luke Borowy; 27.07.2015

В соответствии с двумя комментариями непосредственно выше, IN, чтобы сосредоточиться на окне pygame (эффективно удерживать курсор в пределах окна pygame, пока я не смог заставить это работать со следующим кодом:

pygame.event.set_grab(True) # Keeps the cursor within the pygame window

Объедините этот код со способом выхода из программы нажатием клавиши, такой как клавиша ESCAPE (поскольку будет невозможно закрыть окно, переместив курсор в рамку окна, чтобы закрыть его таким образом с помощью pygame.QUIT):

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            run = False
person thescoop    schedule 09.10.2018