pynput设置GlobalHotKeys热键发送文本时出现重复输出及多余字符问题
修复方案
核心问题原因
- 热键回调绑定错误:原代码给
GlobalHotKeys传递的是send_text()、clean_text(),属于直接调用函数,而非传递函数引用作为回调,会导致初始化时就执行函数、热键触发时回调逻辑异常。 - 热键触发时
ctrl/alt/shift修饰键处于按下状态,系统会先输出组合键对应的默认字符(如ctrl+alt+1对应¹),再执行写入逻辑,导致多余字符;同时按住快捷键会重复触发按键事件,导致多次写入。 - 混用
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
相关产品推荐
相关产品推荐

