我正在使用 python 模块键盘创建一个热键,它的工作方式就像它应该的那样,直到我打开任务管理器,之后热键就停止工作,创建一个新的热键没有帮助,任务管理器之后没有热键工作被打开。
import keyboard
def hello():
print('hello world!')
keyboard.add_hotkey('alt+p', hello, args=())
while True:
pass
上面的代码只是复制问题的示例,我导入模块,创建热键,然后创建无限 while 循环,这样程序就不会退出,并且热键可以工作直到您打开任务管理器。
我需要使用 add_hotkey 而不是任何其他函数的原因是因为我要将它用于更大的程序,并且 add_hotkey 不会减慢应用程序的速度,但当然,它可能会中断,然后只能重新启动该程序将修复它。
我已经尝试了很多东西,部分起作用,重新导入模块效果很好,但我没有办法知道重新导入它的正确时间,而且我也可以以管理员身份运行程序,这也解决了问题,但我不希望程序仅因为热键功能而以管理员身份运行。
我进行了更多测试,找到了答案(令人惊讶的是,在网上发布问题后回答自己的问题是多么容易)。
基本上我的程序没有管理员权限,因此当任务管理器启动时键盘模块会暂停,我知道它会这样做,但我认为它破坏了整个模块。实际发生的情况是,我通过按 ctrl shift esc 启动任务管理器,按键在程序中注册,然后管理器启动,程序暂停,当我松开按键时,程序不会注册。
因此,每当我按下 alt + p 时,模块都会认为我按下了 ctrl shift esc alt p。
要修复它,您只需按所有三个键,但不要同时刷新它。
我还没有尝试过,但我要做的只是让我的程序在按下任何键盘后清除所有按键,这样热键仍将起作用,并且在 ctrl shift esc 后它将挂起,然后取消暂停并清除剩余的内容输入。
我很难过,因为我也遇到了同样的问题。 我终于找到了解决方案! 它正在使用“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'事件,因此即使在任务管理器打开后也能正常工作。
现在在2024年遇到同样的问题。
但是,我注意到一种新的方法来解决它。不确定这是否会对任何人有帮助。
def fixHotKey():
time.sleep(1)
while "Taskmgr.exe" in (i.name() for i in psutil.process_iter()):
time.sleep(1)
#print("found Taskmgr.exe")
time.sleep(1)
keyboard.press_and_release("ctrl")
keyboard.press_and_release("shift")
keyboard.press_and_release("esc")
keyboard.add_hotkey("ctrl+shift+esc", fixHotKey)
它将检测
ctrl+shift+esc
,然后进入 while 循环检查任务管理器是否不存在。然后按下并释放 ctrl、shift 和 esc。然后热键再次起作用。