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

如何正确实现快捷键捕获函数?解决修饰键相关异常问题

解决键盘快捷键捕获的两个问题

问题根源分析

你的代码存在两个核心问题:

  1. 先读取一个键后立即判断修饰键是否按住,若第一个键是修饰键,会强制等待读取第二个键,导致用户仅按修饰键时,最终读到两次该键(按下+松开或重复触发)。
  2. 没有区分「仅按下修饰键」和「修饰键+普通键」的场景,逻辑上强制要求修饰键后必须跟第二个键。

修改后的代码

def hotkey(widget):
    # 记录所有按键事件,直到最后一个按键被释放
    events = keyboard.record(until='release')
    # 筛选出所有按下动作的键(排除释放动作)
    pressed_keys = [event.name for event in events if event.event_type == 'down']
    
    modifiers = {"shift", "ctrl", "alt"}
    # 去重并保留按键顺序(避免重复记录按住的修饰键)
    unique_pressed = list(dict.fromkeys(pressed_keys))
    
    # 仅按下单个键(包括修饰键)
    if len(unique_pressed) == 1:
        key = unique_pressed[0]
    # 先按修饰键,再按普通键的组合场景
    elif len(unique_pressed) >= 2 and unique_pressed[0] in modifiers:
        # 确保第二个键不是修饰键(若需支持多修饰键组合可删除此判断)
        if unique_pressed[1] not in modifiers:
            key = f"{unique_pressed[0]} + {unique_pressed[1]}"
        else:
            # 连续按多个修饰键时,仅返回第一个按下的修饰键
            key = unique_pressed[0]
    # 先按普通键的场景,直接返回普通键
    else:
        key = unique_pressed[0]
    
    widget.value = key.title()
    widget.update()
    print(key)

代码逻辑说明

  • 用keyboard.record()完整捕获用户的按键序列,直到所有按键都被释放,解决了「必须快速按第二个键」的问题——用户可以按住修饰键任意时间后再按普通键。
  • 通过筛选按下动作的键并去重,精准区分不同按键场景:
    • 仅按单个键时,直接返回该键(解决单独按修饰键返回重复键的问题)。
    • 修饰键+普通键的组合,返回正确的快捷键格式。
    • 误按多个修饰键时,仅返回第一个按下的修饰键(可根据需求调整为支持多修饰键组合)。

内容的提问来源于stack exchange,提问作者truefake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:52:45