
本文介绍如何使用python独占监听某台usb键盘的按键事件,同时屏蔽其系统级输入,使其仅向python程序传递原始按键数据。
在嵌入式控制、工业HMI、Kiosk终端或安全输入场景中,常需让某台专用usb键盘(如条码枪、自定义小键盘)绕过操作系统默认输入栈,直接将原始按键事件交由Python程序处理,而完全阻止其触发常规键盘行为(如打字、快捷键、系统热键等)。这本质上是实现“键盘输入劫持 + 事件隔离”。
核心思路是:精准识别目标设备 → 全局屏蔽其所有按键 → 在底层捕获原始事件 → 交由应用逻辑处理。虽然keyboard库提供block_key()等便捷接口,但其屏蔽是全局且无设备粒度的;而pynput虽支持监听,却不内置设备过滤能力。因此,需结合二者,并辅以linux udev规则或windows HID设备路径识别(跨平台方案见后文说明)。
以下为推荐的稳健实现(以Linux为例,windows原理相同,仅设备枚举方式不同):
import keyboard from pynput import keyboard as pynput_kb import time # 步骤1:预先确定目标键盘的键码范围(通常0–149覆盖标准键) # 注意:block_key()按扫描码(scan code)屏蔽,非字符或虚拟键码 for scancode in range(0, 150): try: keyboard.block_key(scancode) except Exception: pass # 忽略无效扫描码 # 步骤2:使用pynput监听——它能捕获被block_key屏蔽后的底层事件 def on_press(key): try: # key.vk 是虚拟键码(Windows)或X11 keycode(Linux),较稳定 vk = getattr(key, 'vk', None) if vk is not None: print(f"[CAPTURED] Virtual Key: {vk}, Raw: {key}") # ✅ 此处加入你的业务逻辑:解析为指令、触发动作、转发到串口等 # 示例:若VK=13(Enter),执行自定义确认流程 if vk == 13: process_enter_command() except Exception as e: print(f"Key processing error: {e}") def process_enter_command(): print("→ Executing custom ENTER handler (not system input!)") # 启动监听(阻塞式) with pynput_kb.Listener(on_press=on_press) as listener: print("✅ USB keyboard input hijacked. Press Ctrl+C to exit.") listener.join()
⚠️ 重要注意事项:
立即学习“Python免费学习笔记(深入)”;
- keyboard.block_key() 需要管理员/root权限(Linux下需sudo,Windows需以管理员运行);否则屏蔽无效;
- pynput监听器必须在block_key()之后启动,否则可能漏捕初始按键;
- 上述代码对所有键盘生效。如需精确绑定单个USB设备,请结合evdev(Linux)或pywinusb(Windows)先通过/dev/input/by-path/或设备实例ID筛选物理设备,再获取其专属事件节点,从而实现设备级隔离;
- macOS因沙盒限制,无法可靠拦截系统键盘事件,不推荐在此平台使用该方案;
- 生产环境建议添加异常恢复逻辑(如keyboard.unhook_all()清理)和热键退出机制(如监听Ctrl+Alt+Q自动解除屏蔽)。
总结:本方案通过keyboard库实现输入屏蔽、pynput库完成事件捕获,构成轻量可靠的键盘独占管道。如需更高精度的设备绑定,应扩展为基于evdev(Linux)或HIDAPI(跨平台)的底层设备监听,避免影响其他USB键盘——这才是真正面向“某一台”而非“所有键盘”的工程化实践。