#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’ для одной клавиши на клавиатуре, поэтому он будет работать нормально даже после включения диспетчера задач.