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

pynput设置GlobalHotKeys热键发送文本时出现重复输出及多余字符问题

修复方案

核心问题原因

  1. 热键回调绑定错误:原代码给GlobalHotKeys传递的是send_text()、clean_text(),属于直接调用函数,而非传递函数引用作为回调,会导致初始化时就执行函数、热键触发时回调逻辑异常。
  2. 热键触发时ctrl/alt/shift修饰键处于按下状态,系统会先输出组合键对应的默认字符(如ctrl+alt+1对应¹),再执行写入逻辑,导致多余字符;同时按住快捷键会重复触发按键事件,导致多次写入。
  3. 混用pynput.keyboard和第三方keyboard库,存在行为冲突风险。

修正后代码

from pynput import keyboard as kbd
from pynput.keyboard import Key, Controller
import re
import time

txt_base = '45.785.422/0001-25'
# 统一使用pynput的键盘控制器
keyboard = Controller()

def send_text():
    # 等待所有修饰键释放后再写入,避免组合键默认输入干扰
    while (
        keyboard.pressed(Key.ctrl) 
        or keyboard.pressed(Key.alt) 
        or keyboard.pressed(Key.shift)
    ):
        time.sleep(0.01)
    keyboard.type(txt_base)

def clean_text():
    # 等待所有修饰键释放
    while (
        keyboard.pressed(Key.ctrl) 
        or keyboard.pressed(Key.alt) 
        or keyboard.pressed(Key.shift)
    ):
        time.sleep(0.01)
    txt_array = re.findall(r'\d+', txt_base)
    txt_cln = ''.join(txt_array)
    keyboard.type(txt_cln)

# 回调传递函数对象,不加括号
hotkeys = kbd.GlobalHotKeys({
    '<ctrl>+<alt>+1': send_text,
    '<ctrl>+<shift>+<alt>+1': clean_text,
})

with hotkeys:
    hotkeys.join()

修改说明

  • 修正热键绑定逻辑:去掉回调函数后的括号,仅在热键触发时执行对应逻辑,解决重复输出问题。
  • 统一使用pynput的键盘控制器,删掉冲突的第三方库导入,避免逻辑异常。
  • 写入文本前增加修饰键释放检测,仅在用户松开快捷键后写入内容,避免组合键默认字符混入输出,解决多余¹的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:24:03