如何在Windows中监视USB设备枚举和删除?

如何在Windows中监视USB设备枚举和删除?,windows,usb,Windows,Usb,我想在运行Windows的计算机的USB总线上监视(un)插件事件。当设备(未)插入时,我想知道它的USB地址、供应商id、根集线器id和设备上方的集线器端口。例如 usb地址:10,供应商id:1234,产品id:5678,总线id:2,端口路径:5/4/3 这意味着它是总线id 2端口5上的一个设备,插入了另一个集线器,在该集线器的端口4上有另一个集线器,在该集线器的端口3上有正在报告的设备 我正试图编写一小段特定于操作系统的代码来进行USB设备热插拔检测,以集成到更大的跨平台(Linux、

我想在运行Windows的计算机的USB总线上监视(un)插件事件。当设备(未)插入时,我想知道它的USB地址、供应商id、根集线器id和设备上方的集线器端口。例如 usb地址:10,供应商id:1234,产品id:5678,总线id:2,端口路径:5/4/3

这意味着它是总线id 2端口5上的一个设备,插入了另一个集线器,在该集线器的端口4上有另一个集线器,在该集线器的端口3上有正在报告的设备

我正试图编写一小段特定于操作系统的代码来进行USB设备热插拔检测,以集成到更大的跨平台(Linux、Windows、Mac)测试程序中。使用此热插拔代码的代码是用Python 3编写的,因此我更愿意用Python编写热插拔代码,但我在这方面有点灵活,但我确实希望避免任何需要我支付许可证费用的事情

似乎有两个主要的选择:

我看过一些关于Windows API函数RegisterDeviceNotification的讨论,但我不清楚是否可以注册以接收所有USB设备的事件,或者是否需要知道特定设备接口(如键盘、鼠标等)的GUID。如果是这样的话,这个解决方案似乎不起作用,因为我想监控所有的USB设备

另一个选项似乎涉及到一种叫做“WMI”的东西,它似乎主要出现在“托管”代码的讨论中,这将迫使我用.NET语言(如C#或IronPython)编写此组件。这个问题()询问如何查询USB设备,并提供了一个示例,但它不处理热插拔事件,用户“Nedko”建议应该使用类而不是Win32_USBHub。我真的不明白Win32_USBControllerDevice对象实际建模的是什么。看起来依赖成员可能是对CIM_LogicalDevice对象的引用,但即使如此,它似乎也缺少我正在寻找的特定于USB的信息


我应该看哪些API来解决这个问题?

您看到的是USB设备类。还有一些接口类。传递
GUID\u DeviceInterface\u USB\u设备(
usbiodef.h
,驱动程序文档)会为任何USB活动生成事件。另一个可能的候选者,
GUID\u DEVCLASS\u USB
,似乎是针对无法识别的USB设备。在测试过程中,我没能让它触发

请注意,(一位Microsoft开发人员)似乎声称传递接口类GUID不起作用。他的文章发表于2006年(2009年)之前,声称我详述的方法是有效的

如果您需要与Windows的低级功能进行交互,那么您将面临一场艰苦的战斗,试图从Python实现这一点(大约2018年)。铁蟒可能会很好。C#是命中还是未命中-通常您会发现缺少重要的功能。任何给定库的绑定通常都无法正常工作

< >使用C++中的WMI,如C语言中的(例如,用<代码>管理对象搜索器< /代码>和<代码>管理对象< /代码>),您应该实例化一个使用,然后调用.< /p> 有关更多信息,您可以查看