pynput全局热键长按无法连续触发,如何实现重复调用回调?
pynput全局热键长按连续触发解决方案
问题原因
pynput自带的GlobalHotKeys工具类默认仅响应按键的首次按下事件,会主动忽略操作系统生成的长按重复触发事件,因此长按组合键时只会触发一次回调,必须松开按键再次按下才能重新触发。
实现代码
直接使用底层的键盘监听器自行维护修饰键状态,响应所有按下事件(含系统生成的重复事件),即可实现长按连续触发效果:
from pynput import keyboard # 存储修饰键按下状态 modifier_state = { "ctrl": False, "alt": False } # 热键对应回调配置 hotkey_callbacks = { "h": lambda: print("<ctrl>+<alt>+h pressed"), "i": lambda: print("<ctrl>+<alt>+i pressed") } def on_press(key): # 更新修饰键按下状态 if key in (keyboard.Key.ctrl_l, keyboard.Key.ctrl_r): modifier_state["ctrl"] = True elif key in (keyboard.Key.alt_l, keyboard.Key.alt_r): modifier_state["alt"] = True # 匹配普通按键触发对应回调 elif hasattr(key, "char") and modifier_state["ctrl"] and modifier_state["alt"]: if key.char in hotkey_callbacks: hotkey_callbacks[key.char]() # 按下ESC退出监听 if key == keyboard.Key.esc: return False def on_release(key): # 更新修饰键释放状态 if key in (keyboard.Key.ctrl_l, keyboard.Key.ctrl_r): modifier_state["ctrl"] = False elif key in (keyboard.Key.alt_l, keyboard.Key.alt_r): modifier_state["alt"] = False if __name__ == "__main__": with keyboard.Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
自定义触发间隔说明
上述实现的触发频率和系统按键重复速率保持一致,如果需要自定义固定间隔触发,可以额外启动一个后台线程,检测到对应组合键处于按下状态时按设定间隔循环调用回调即可。
内容的提问来源于stack exchange,提问作者Sarvesh M.D
相关产品推荐
相关产品推荐

