keyboard.add_hotkey 在打开任务管理器后停止工作

问题描述 投票:0回答:3

我正在使用 python 模块键盘创建一个热键,它的工作方式就像它应该的那样,直到我打开任务管理器,之后热键就停止工作,创建一个新的热键没有帮助,任务管理器之后没有热键工作被打开。

import keyboard

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

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

while True:
    pass

上面的代码只是复制问题的示例,我导入模块,创建热键,然后创建无限 while 循环,这样程序就不会退出,并且热键可以工作直到您打开任务管理器。

我需要使用 add_hotkey 而不是任何其他函数的原因是因为我要将它用于更大的程序,并且 add_hotkey 不会减慢应用程序的速度,但当然,它可能会中断,然后只能重新启动该程序将修复它。

我已经尝试了很多东西,部分起作用,重新导入模块效果很好,但我没有办法知道重新导入它的正确时间,而且我也可以以管理员身份运行程序,这也解决了问题,但我不希望程序仅因为热键功能而以管理员身份运行。

python python-3.x windows keyboard hotkeys
3个回答
1
投票

我进行了更多测试,找到了答案(令人惊讶的是,在网上发布问题后回答自己的问题是多么容易)。

基本上我的程序没有管理员权限,因此当任务管理器启动时键盘模块会暂停,我知道它会这样做,但我认为它破坏了整个模块。实际发生的情况是,我通过按 ctrl shift esc 启动任务管理器,按键在程序中注册,然后管理器启动,程序暂停,当我松开按键时,程序不会注册。

因此,每当我按下 alt + p 时,模块都会认为我按下了 ctrl shift esc alt p。

要修复它,您只需按所有三个键,但不要同时刷新它。

我还没有尝试过,但我要做的只是让我的程序在按下任何键盘后清除所有按键,这样热键仍将起作用,并且在 ctrl shift esc 后它将挂起,然后取消暂停并清除剩余的内容输入。


0
投票

我很难过,因为我也遇到了同样的问题。 我终于找到了解决方案! 它正在使用“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'事件,因此即使在任务管理器打开后也能正常工作。


0
投票

现在在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。然后热键再次起作用。

© www.soinside.com 2019 - 2024. All rights reserved.