You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 18:54:02