我使用::RegisterDeviceNotification()
(msdn)订阅了通知。在处理了一些细节(消息WM_DEVICECHANGE
(msdn)等)后,我有DEV_BROADCAST_DEVICEINTERFACE
(msdn)结构。
我怎么知道插入的设备是移动电话或相机?例如?
我用Google搜索 Windows便携设备(msdn)。可以使用DEV_BROADCAST_DEVICEINTERFACE::dbcc_name
作为IPortableDevice::Open
(msdn)的参数。有了这个,就可以获得设备(msdn)的“支持”内容列表,例如:
WPD_CONTENT_TYPE_IMAGE
WPD_CONTENT_TYPE_AUDIO
WPD_CONTENT_TYPE_PLAYLIST
WPD_CONTENT_TYPE_VIDEO
WPD_CONTENT_TYPE_DOCUMENT
WPD_CONTENT_TYPE_UNSPECIFIED
WPD_CONTENT_TYPE_FOLDER
但我不知道相机是否仅支持WPD_CONTENT_TYPE_VIDEO
,WPD_CONTENT_TYPE_IMAGE
和WPD_CONTENT_TYPE_FOLDER
?
另一个框架是 Windows Image Acquisition (msdn),但是这个东西看不到手机(只有扫描仪,也许是别的,我不知道)。
答案 0 :(得分:0)
例如,如果您有无线鼠标。当您打开鼠标的电源时,它将尝试将自身连接到加密狗或蓝牙等。如果这些设备当前未安装,则必须首先添加它们。触发器向后移动设备链,直到有效的USB驱动程序处理电源开/关事件。
然后每个阶段必须将一个驱动程序添加到USB堆栈以处理该设备。并且堆栈建立回到最终终点。您将收到添加到堆栈的每个usb驱动程序的通知。但是您将通过驱动程序初始化异步接收通知。因此,无法保证在您收到通知时设备可供使用。
由于这个原因,在通知时无法确切地确定添加了哪个设备。但是你确实得到了关于这种类型的信息。
找出具体设备的正确方法是枚举机器上的USB设备。不过要小心。如果您快速枚举,您将错过刚刚添加的设备。
一种可靠的方法是在收到枚举机器上USB设备的通知后等待几毫秒甚至几秒钟。例如,如果手机需要将3个驱动程序添加到堆栈中,那么您需要等到收到所有3个通知,并等到这3个驱动程序初始化后才会在枚举中显示电话。
枚举包括查找注册表中存在的guid。在驱动程序初始化完成之前,不会添加条目,然后驱动程序可以向硬件询问其Identifying guid。然后guid插入到注册表中。不幸的是,对于不同风格的窗口,注册表中的位置是不同的。
有关windows7的参考,请查看HKLM \ SYSTEM \ CurrentControlSet \ Enum \ USB ... 您将看到已插入该计算机的每个设备的列表。每个VID_xxxx和PID_xxxx对都是不同的设备。
枚举“活动”并插入计算机的USB设备的最佳方法是通过Windows Management Instrumentation。在驱动程序有时间识别设备后的适当时间触发此操作。然后在枚举回调中检查VID,PID,制造商,设备名称等,看看它是否是您想要的那个。
很抱歉,我无法找到Windows SDK示例,但这是一个很好的起点,它展示了如何枚举USB设备以查看是否是XInputDevice。您需要更换vid和pid,并检查您要查找的设备:http://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx
是的,这可能会简单得多,但嘿,如果很简单,每个人都会这样做。
祝你好运!