使用pynput listener创建键盘快捷键时调试正常运行异常如何解决
问题根源
你同时引入了keyboard和pynput两个全局键盘监听库,二者都会向系统申请键盘事件钩子。调试运行时IDE通常持有更高的系统权限,能够让两个库的钩子同时正常工作;但直接运行时权限不足,会出现钩子抢夺失败的情况,导致keyboard.read_key()无响应、拿不到按键输入。
修复方案
统一使用pynput实现所有键盘操作,移除冗余的keyboard库依赖即可解决冲突问题,修复后代码如下:
import ast from pynput import keyboard as kb from pynput.keyboard import Controller keyboard_events = {} path = 'D:\\shortcuts.ini' # 优化文件读取逻辑,自动关闭文件句柄 with open(path, 'r', encoding='utf-8') as f: content = f.read() keyboard_events = ast.literal_eval(content) keyboard_controller = Controller() hotkey_triggered = False def on_activate(): global hotkey_triggered print('Global hotkey activated!') hotkey_triggered = True def on_single_press(key): global hotkey_triggered if not hotkey_triggered: return True # 处理按键字符 try: c = key.char except AttributeError: # 特殊按键转换为字符串格式匹配字典 c = str(key).split('.')[-1].replace("'","") if c in keyboard_events: print(keyboard_events[c]) keyboard_controller.type(keyboard_events[c]) # 重置触发状态,等待下次热键激活 hotkey_triggered = False return True def for_canonical(f): return lambda k: f(l.canonical(k)) hotkey = kb.HotKey( kb.HotKey.parse('<ctrl>+<shift>'), on_activate ) # 同时监听热键和后续按键 with kb.Listener( on_press=lambda k: (for_canonical(hotkey.press)(k), on_single_press(k)), on_release=for_canonical(hotkey.release) ) as l: l.join()
核心修改点
- 移除了
keyboard库的所有调用,全流程用pynput实现,彻底解决钩子冲突问题 - 热键触发后通过状态位标记,直接复用当前的监听线程获取后续输入,不需要额外启动阻塞的按键读取逻辑
- 补充了特殊按键的格式转换逻辑,匹配预设字典里的按键命名规则
- 优化了文件读取逻辑,自动释放文件句柄避免资源泄漏
内容的提问来源于stack exchange,提问作者Gabriel Delgado
相关产品推荐
相关产品推荐

