如何在Windows下检测特定VID/PID的USB设备插入时自动触发Python脚本
Windows下特定USB设备插入自动运行Python脚本的实现方案
方案一:原生任务计划程序+事件日志监听(推荐,无额外依赖)
步骤1:确认目标USB设备的VID/PID
打开设备管理器,找到目标USB设备,右键→属性→详细信息→硬件ID,复制类似USB\VID_XXXX&PID_XXXX的字符串。也可以用命令行工具devcon find *usb*(需先获取devcon)查看所有USB设备的ID。步骤2:配置事件筛选器
- 打开「事件查看器」,定位到「Windows日志→系统」。
- 点击右侧「筛选当前日志」,设置:
- 日志:系统
- 来源:PlugPlayManager
- 事件ID:2003(设备成功安装事件,若不匹配可插入设备后查看最新的PlugPlayManager事件)
- 切换到「XML」标签,勾选「手动编辑查询」,替换为以下XML(将
VID_XXXX&PID_XXXX换成你的设备ID):<QueryList> <Query Id="0" Path="System"> <Select Path="System">*[System[Provider[@Name='PlugPlayManager'] and EventID=2003]] and *[EventData[Data[@Name='HardwareId'] and Data='USB\VID_XXXX&PID_XXXX']]</Select> </Query> </QueryList> - 测试筛选:插入目标USB设备,确认事件能被筛选出来。
步骤3:创建自动触发的任务计划
- 打开「任务计划程序」,点击「创建基本任务」。
- 名称填「USB触发Python脚本」,下一步。
- 触发器选「当特定事件被记录时」,日志选「系统」,来源选「PlugPlayManager」,事件ID填2003,下一步。
- 操作选「启动程序」,程序或脚本填
python.exe(若Python未加入系统PATH,需填完整路径如C:\Python3.10\python.exe)。 - 添加参数填你的Python脚本完整路径,比如
"C:\scripts\auto_run_script.py",下一步。 - 勾选「不管用户是否登录都要运行」,并设置权限为最高权限,避免脚本执行失败。
- 完成任务创建,测试插入USB设备,确认脚本自动运行。
方案二:Python实时监听USB事件(适合自定义逻辑场景)
步骤1:依赖安装
执行命令安装pywin32库:pip install pywin32步骤2:编写监听脚本
以下脚本通过监听Windows的WM_DEVICECHANGE消息,检测USB设备插入并匹配目标VID/PID:import win32api import win32gui import win32con import subprocess from win32com.client import GetObject # 替换为你的目标USB设备ID TARGET_USB_ID = "VID_1234&PID_5678" def get_usb_devices(): # 通过WMI获取当前USB设备列表 wmi = GetObject("winmgmts:") devices = wmi.InstancesOf("Win32_USBControllerDevice") usb_ids = [] for dev in devices: try: pnp_id = dev.Dependent.PNPDeviceID if "VID_" in pnp_id and "PID_" in pnp_id: usb_ids.append(pnp_id.split("\\")[1]) except: continue return usb_ids class USBMonitor: def __init__(self): # 创建隐藏窗口用于接收设备消息 wc = win32gui.WNDCLASS() wc.lpfnWndProc = self.wnd_proc wc.lpszClassName = "USBMonitorClass" win32gui.RegisterClass(wc) self.hwnd = win32gui.CreateWindow(wc.lpszClassName, "", 0, 0, 0, 0, 0, 0, 0, 0) # 注册设备通知 dev_notify_handle = win32api.RegisterDeviceNotification( self.hwnd, win32api.CreateFile("\\\\.\\USB", win32con.GENERIC_READ | win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0, None), win32con.DEVICE_NOTIFY_WINDOW_HANDLE ) def wnd_proc(self, hwnd, msg, wparam, lparam): if msg == win32con.WM_DEVICECHANGE: if wparam == win32con.DBT_DEVICEARRIVAL: # 设备插入,检查是否为目标设备 current_usb_ids = get_usb_devices() if TARGET_USB_ID in current_usb_ids: # 运行目标脚本 subprocess.run(["python.exe", "C:\\scripts\\your_script.py"], shell=True) return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) if __name__ == "__main__": monitor = USBMonitor() print("USB监听已启动...") win32gui.PumpMessages()步骤3:设置监听脚本开机自启
把脚本的快捷方式放到Windows启动文件夹(路径:C:\Users\[你的用户名]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup),或通过任务计划设置开机自动启动该脚本。
内容的提问来源于stack exchange,提问作者ask_lot
相关产品推荐
相关产品推荐

