需求:编写Python脚本拦截特定USB键盘正常输入并仅供程序处理
实现指定USB键盘的输入拦截与定向处理
要实现拦截指定USB键盘的常规输入、仅将数据传入Python程序处理,核心思路是独占目标键盘的输入设备,让系统不再处理它的输入事件,同时直接读取设备的原始HID数据。以下分平台给出具体实现方案:
Linux 平台实现
前置准备
- 安装依赖库:
pip install evdev - 识别目标键盘:
- 运行
lsusb找到目标键盘的 Vendor ID(VID)和 Product ID(PID),格式类似Bus 001 Device 005: ID 1234:5678 XXXX Keyboard - 或者在
/dev/input/by-id/目录下找到对应键盘的设备文件(比如usb-XXXX_Keyboard-event-kbd)
- 运行
代码示例
from evdev import InputDevice, categorize, ecodes, list_devices # 替换为你的键盘VID和PID(十六进制转十进制) TARGET_VID = 0x1234 TARGET_PID = 0x5678 # 枚举所有输入设备,找到目标键盘 devices = [InputDevice(path) for path in list_devices()] target_device = None for dev in devices: if dev.info.vendor == TARGET_VID and dev.info.product == TARGET_PID: target_device = dev break if not target_device: print("未找到目标键盘设备") exit(1) # 独占设备,阻止系统处理该键盘的输入 target_device.grab() print(f"已拦截目标键盘:{target_device.name}") print("开始读取输入数据...") try: for event in target_device.read_loop(): # 仅处理按键事件 if event.type == ecodes.EV_KEY: key_event = categorize(event) # 这里可以添加自定义处理逻辑 print(f"按键: {key_event.keycode}, 状态: {'按下' if key_event.keystate == key_event.key_down else '释放'}") except KeyboardInterrupt: print("\n脚本终止") finally: target_device.ungrab()
权限说明
- 运行脚本需要
root权限,或者将当前用户添加到input用户组:sudo usermod -aG input $USER,重启后生效。
Windows 平台实现
前置准备
- 安装依赖库:
pip install pywin32 hidapi - 识别目标键盘的 VID 和 PID:可以用设备管理器查看键盘的硬件ID,格式类似
USB\VID_1234&PID_5678
代码示例
import win32api import win32gui import win32con import hid # 替换为你的键盘VID和PID(十六进制) TARGET_VID = 0x1234 TARGET_PID = 0x5678 # 找到目标HID设备 device = hid.device() device.open(TARGET_VID, TARGET_PID) print(f"已连接目标键盘:{device.get_product_string()}") # 创建隐藏窗口用于捕获原始输入 class RawInputWindow: def __init__(self): self.hwnd = None self.register_raw_input() def register_raw_input(self): wc = win32gui.WNDCLASS() wc.lpfnWndProc = self.wnd_proc wc.lpszClassName = "RawInputWindowClass" win32gui.RegisterClass(wc) self.hwnd = win32gui.CreateWindow(wc.lpszClassName, "", 0, 0, 0, 0, 0, 0, 0, 0) # 注册原始输入设备,仅监听目标键盘 raw_input_devs = [ { "usUsagePage": 0x01, "usUsage": 0x06, # 键盘设备 "dwFlags": win32con.RIDEV_INPUTSINK, "hwndTarget": self.hwnd } ] win32api.RegisterRawInputDevices(raw_input_devs) def wnd_proc(self, hwnd, msg, wparam, lparam): if msg == win32con.WM_INPUT: # 读取原始输入数据 data = win32api.GetRawInputData(lparam, win32con.RID_INPUT) # 解析键盘数据(这里简化处理,可根据HID报告格式详细解析) print(f"收到键盘原始数据:{data}") # 返回0阻止系统处理该输入事件 return 0 return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) if __name__ == "__main__": try: window = RawInputWindow() print("开始监听键盘输入...") win32gui.PumpMessages() except KeyboardInterrupt: print("\n脚本终止") finally: device.close()
注意事项
- 脚本需要以管理员权限运行,否则无法注册原始输入设备或独占设备。
- Windows下的HID报告解析需要根据具体键盘的协议调整,上述代码仅做基础演示。
通用注意事项
- 设备识别:务必确认目标键盘的VID/PID准确,避免误拦截其他输入设备。
- 异常处理:建议添加设备断开后的重连逻辑,避免脚本因设备意外断开而崩溃。
- 兼容性:不同品牌的键盘HID报告格式可能不同,需要根据实际情况调整数据解析逻辑。
内容的提问来源于stack exchange,提问作者Shresth Sharma
相关产品推荐
相关产品推荐

