
本文介绍如何使用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键盘——这才是真正面向“某一台”而非“所有键盘”的工程化实践。










