You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:编写Python脚本拦截特定USB键盘正常输入并仅供程序处理

实现指定USB键盘的输入拦截与定向处理

要实现拦截指定USB键盘的常规输入、仅将数据传入Python程序处理,核心思路是独占目标键盘的输入设备,让系统不再处理它的输入事件,同时直接读取设备的原始HID数据。以下分平台给出具体实现方案:

Linux 平台实现

前置准备

  1. 安装依赖库:pip install evdev
  2. 识别目标键盘:
    • 运行 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 平台实现

前置准备

  1. 安装依赖库:pip install pywin32 hidapi
  2. 识别目标键盘的 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:25:14