
本文介绍使用python独占监听特定usb键盘按键事件的方法,通过组合`pynput`捕获原始输入与`keyboard`模块全局屏蔽键位,实现键盘仅向python程序输送数据、不触发系统默认行为的目标。
在实际开发中(如工业HID设备控制、定制化外设交互或安全输入场景),常需让某个USB键盘“脱离”操作系统常规输入流,转而由Python程序独占接管其所有按键事件——即:按键不触发打字、快捷键、焦点切换等系统行为,但能被程序实时、低延迟地捕获并处理。
⚠️ 重要前提:该方案无法物理区分多个同型号键盘,而是基于“全局键位拦截+高优先级监听”实现逻辑独占。若系统中存在多个相同键盘,需配合udev规则(Linux)或HID设备路径过滤(Windows/macOS)进一步精准绑定,本文聚焦通用Python层实现。
核心思路
- 屏蔽所有键位系统响应:使用 keyboard.block_key() 对常用键码(如0–149)进行全局拦截;
- 同步监听原始按键事件:用 pynput.keyboard.Listener 在底层捕获被拦截的按键,确保不丢失任何输入;
- 在回调中完成自定义处理:例如解析组合键、转发至网络、触发自动化脚本等。
完整可运行示例
import keyboard
from pynput import keyboard as pynput_kb
import sys
# 预先屏蔽常见键位(覆盖字母、数字、功能键、方向键等)
# 注意:键码范围因平台略有差异,此处为通用保守值
BLOCKED_KEYS = list(range(1, 150)) # 排除键码0(保留未定义行为)
for key_code in BLOCKED_KEYS:
try:
keyboard.block_key(key_code)
except (ValueError, OSError):
pass # 忽略无效键码或权限错误
# 自定义处理逻辑
def on_press(key):
try:
if hasattr(key, 'char') and key.char is not None:
print(f"[INFO] 字符键: '{key.char}'")
elif hasattr(key, 'name'):
print(f"[INFO] 功能键: {key.name}")
else:
print(f"[INFO] 未知按键: {key}")
# ✅ 此处插入您的业务逻辑:如解析扫描枪数据、触发PLC指令等
except Exception as e:
print(f"[ERROR] 处理按键时异常: {e}")
def on_release(key):
# 可选:监听松开事件(如长按检测)
if key == pynput_kb.Key.esc:
print("[INFO] 按下 Esc 退出监听")
return False # 停止监听
# 启动监听器(阻塞式)
print("[READY] USB键盘已独占接管,按键将仅发送至本程序...")
with pynput_kb.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()关键注意事项
- ? 权限要求:
- Linux:需 sudo 运行,或配置 udev 规则赋予当前用户 /dev/uinput 访问权限;
- Windows:建议以管理员身份运行,否则部分全局拦截可能失效;
- macOS:需开启“辅助功能”权限(系统设置 → 隐私与安全性 → 辅助功能 → 添加终端/IDE)。
- ? 键码兼容性:keyboard.block_key() 的键码与 pynput 的 KeyCode 并非完全一一映射,上述示例采用“广谱屏蔽+安全回调”策略,兼顾鲁棒性;如需精确控制,可结合 keyboard._os_keyboard.get_hotkey_name() 或 pynput 的 Key 枚举精确定义。
- ⚙️ 性能与延迟:该方案基于操作系统事件循环,通常延迟
总结
通过 pynput 提供的底层监听能力与 keyboard 的全局拦截机制协同工作,即可在不修改系统驱动的前提下,实现对任意USB HID键盘的逻辑独占。该方法轻量、跨平台(需适配权限)、易于集成,是构建定制化人机交互应用的理想起点。后续可扩展支持多键盘识别(通过 evdev 或 hidapi 获取设备序列号)、热插拔自动重连及加密输入通道等功能。










