keyboard.add_hotkey перестает работать после открытия taskmanager

#python #python-3.x #windows #keyboard #hotkeys

#python #python-3.x #Windows #клавиатура #горячие клавиши

Вопрос:

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

 import keyboard

def hello():
    print('hello world!')

keyboard.add_hotkey('alt p', hello, args=())

while True:
    pass
  

приведенный выше код является лишь примером для воспроизведения проблемы, я импортирую модуль, создаю горячую клавишу, затем создаю бесконечный цикл while, чтобы программа не завершалась, и горячая клавиша работает, пока вы не откроете диспетчер задач.

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

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

Ответ №1:

Я провел еще несколько тестов и нашел ответ (удивительно, как легко ответить на ваш собственный вопрос после публикации вопроса где-нибудь в Интернете).

По сути, моя программа не имеет прав администратора, поэтому модуль клавиатуры приостанавливается при запуске диспетчера задач, что я и знал, но я думал, что это сломало весь модуль. На самом деле происходит то, что я запускаю свой диспетчер задач, нажимая ctrl shift esc, клавиши регистрируются в программе, затем запускается manager, программа приостанавливается, и когда я отпускаю клавиши, программа этого не регистрирует.

Поэтому всякий раз, когда я нажимал alt p, модуль думал, что я нажимаю ctrl shift esc alt p.

Чтобы исправить это, вы просто нажимаете все три клавиши, но не одновременно, чтобы обновить их.

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

Ответ №2:

Мне было трудно, потому что у меня была такая же проблема. И я, наконец, нашел решение! Он использует ‘keyboard.hook_key’.

Вот мой код.

 import keyboard


temp = False

def switch(e):
    global temp
    if 'down' in e:
        temp = True
    else:
        temp = False

def check(e):
    global temp
    if temp and 'down' in e:
        print('It works!!')

keyboard.hook_key('alt', lambda e: switch(str(e)))
keyboard.hook_key('p', lambda e: check(str(e)))
keyboard.wait()
  

‘hook_key’ обнаруживает только события ‘Down’ и ‘Up’ для одной клавиши на клавиатуре, поэтому он будет работать нормально даже после включения диспетчера задач.