我想监视运行Windows的计算机的USB总线(un)插件事件。当(未)插入设备时,我想知道它的USB地址,供应商ID,根集线器ID和设备上方的集线器端口。例如 usb_addr:10,vendor_id:1234,product_id:5678,bus_id:2,port_path:5/4/3
这意味着它是总线ID 2端口5上的设备,并且插入另一个集线器并在该集线器的端口4上有另一个集线器,该集线器的端口3是正在报告的设备。
我正在尝试编写一个特定于操作系统的小代码块来进行USB设备热插拔检测,以集成到更大的跨平台(Linux,Windows,Mac)测试程序中。使用这个热插拔代码的代码是用Python 3编写的,所以我更喜欢用Python编写hotplug代码,但我对此有点灵活,但我真的想避免任何需要我支付的东西获得许可证。
似乎有两个主要选择:
我已经看过一些关于Windows API函数RegisterDeviceNotification的讨论,但我不清楚是否可以注册接收所有USB设备的事件,或者是否需要知道特定设备接口的GUID(例如。键盘,鼠标等)。如果是这种情况,似乎此解决方案无法正常工作,因为我想监控所有USB设备。
另一个选项似乎涉及一些名为“WMI”的东西,这似乎主要出现在“托管”代码的讨论中,这将迫使我用.NET语言(如C#或IronPython)编写这个组件。这个问题(Get List of connected USB Devices)询问如何查询USB设备并提供一个示例,但它不处理hotplug事件,用户“Nedko”表示应该使用类Win32_USBControllerDevice而不是Win32_USBHub。我真的不明白Win32_USBControllerDevice对象实际建模的内容。似乎Dependent成员可能是对CIM_LogicalDevice对象的引用,但即便如此,它似乎也缺少我正在寻找的USB特定信息。
我应该考虑哪些API来解决这个问题?
答案 0 :(得分:0)
您看到的是USB设备类。还有接口类。传递GUID_DEVINTERFACE_USB_DEVICE
(usbiodef.h
,驱动程序文档)会为任何USB活动生成事件。另一个可能的候选人GUID_DEVCLASS_USB
似乎是针对无法识别的USB设备。我在测试期间无法触发它。
请注意,an article by Doran Holan(Microsoft开发人员)似乎声称传递接口类GUID不起作用。他的文章是在2006年this answer(2009)发布之前发表的,声称我详细说明的方法是有效的。
如果您需要与Windows的低级功能进行交互,那么您将尝试使用Python(大约2018年)进行一场艰苦的战斗。 IronPython可能会很好。 C#是命中注定 - 通常你会发现缺少重要的功能。任何给定库的绑定通常都不会很好。
要像在C#中一样使用C ++中的WMI(例如使用ManagementObjectSearcher
和ManagementObject
),您应该使用IWbemServices
实例化IWbemLocator::ConnectServer
然后调用IWbemServices::ExecQuery
}。
您可以查看WMI C++ Application Examples以获取更多信息。