Использовать свои горячие клавиши только при фокусе на консоле
У меня есть программа которая перехватывает нажатие клавиш и делает какое либо действие
import keyboard
...
keyboard.add_hotkey('Ctrl + down', MoveDown)
Все работает, но работает даже если текущая программа не является главным окном. То есть я переключаюсь в word и все-равно работает перехват.
Как сделать так чтобы программа проверяла на саму себя активную. И работала только когда является главным окном. Пытаюсь поставить проверку на главное активное окно.. Но если я запускаю программу из VSCODE он является главным окном. Из FAR Фар является главным окном. Но ни как не сама прога. Грубо говоря как определить что я нахожусь в своей программе сейчас а не в другой. Программа консольная.
Ответы (1 шт):
Чтобы ловить нажатия только в консоле, можно использовать модуль msvcrt (документация). Но он не распознает нажатия клавиш типа Ctrl, Shift, Alt. Может Esc, некоторые из F1-F12 и стрелки.
import msvcrt
while True:
if msvcrt.kbhit():
pressedKey = msvcrt.getwch()
print("Key Pressed:", pressedKey, ord(pressedKey))
Можно сочетать его с модулем keyboard, чтобы получить механизм создания горячих клавиш. При этом использовать msvcrt как индикатор присутствия или отсутствия в консоле.
import msvcrt, keyboard
def check(method):
if msvcrt.kbhit():
while msvcrt.kbhit():
msvcrt.getch()
method()
def move_down():
print('pressed Ctrl + Down')
keyboard.add_hotkey('Ctrl + Down', lambda: check(move_down))
keyboard.wait()
Проблема данного способа в том, что комбинация Ctrl + Down может порой не срабатывать. Поскольку для msvcrt.kbhit() нажатие Ctrl ничего не значит. Но если начинать комбинацию со второй части, то есть Down + Ctrl - срабатывает всегда.
Следующий код в методе check необходим, чтобы очистить буфер от всех нажатых клавиш. Иначе условие msvcrt.kbhit() может сработать, когда консоль не является активным окном.
while msvcrt.kbhit():
msvcrt.getch()