USB设备使用检测与记录技术问询
USB设备使用检测与记录技术问询
嘿,这个需求完全能实现!我之前帮朋友处理过类似的扫码器被识别成键盘的区分问题,给你几个实用的方案,分不同系统说:
Windows平台方案
- 用Raw Input API做自定义监听
这是Windows原生的底层API,能直接获取每个输入事件对应的设备唯一标识(比如设备ID、厂商/产品ID、设备名称)。你可以用Python搭配pywin32库写个轻量脚本,或者用C#快速开发小工具:- 先通过设备管理器找到扫码器的硬件信息(比如VID/PID),和主键盘做区分;
- 监听全局输入事件,每捕获到按键时先判断来源设备;
- 把时间戳、设备标识、输入内容一起写入日志文件(比如
input_log.txt)。
- AutoHotkey脚本快速实现
如果你不想写复杂代码,AutoHotkey是个好选择。它支持获取输入设备的ID,你可以写个简单脚本:
记得先通过AHK的#Persistent SetTimer, CheckInput, 100 return CheckInput: Input, key, V L1 if (A_InputDevice = "你的扫码器设备名称") { FileAppend, %A_Now% | 扫码器 | %key%`n, input_log.txt } else { FileAppend, %A_Now% | 主键盘 | %key%`n, input_log.txt } returnListInputDevices命令查看并替换成你的扫码器设备名称。
Linux平台方案
- 监听/dev/input事件文件
Linux下每个输入设备对应/dev/input/event*文件,步骤很简单:- 用
evtest工具扫一遍所有event设备,找到扫码器对应的那个(扫个码看哪个设备有输出); - 用
python-evdev库写脚本,同时监听扫码器和主键盘的event文件,捕获输入时记录设备信息和内容:from evdev import InputDevice, categorize, ecodes import datetime scanner = InputDevice('/dev/input/eventX') keyboard = InputDevice('/dev/input/eventY') def log_input(device_name, key): with open('input_log.txt', 'a') as f: f.write(f"{datetime.datetime.now()} | {device_name} | {key}\n") # 监听扫码器 for event in scanner.read_loop(): if event.type == ecodes.EV_KEY and event.value == 1: key = categorize(event).keycode log_input("扫码器", key) # 可单独开线程监听主键盘,这里简化示例
- 用
- udev规则辅助标记设备
你可以给扫码器设置udev规则,让系统给它分配一个固定的别名(比如/dev/scanner_keyboard),这样脚本里不用每次找event编号,更稳定。
关键注意点
- 先锁定设备唯一标识:不管用哪种方法,第一步一定要确认两个设备的区分特征(比如Windows的设备实例ID、Linux的VID/PID),别靠输入速度这类软特征,容易误判;
- 日志格式要清晰:建议包含时间戳、设备名称/ID、输入内容,方便后期溯源;
- 权限问题:Linux下监听event文件需要root权限,Windows下脚本可能需要管理员权限才能捕获全局输入。
备注:内容来源于stack exchange,提问作者Matej Tirpak
相关产品推荐
相关产品推荐

