检测手机或摄像头的插入



我使用::RegisterDeviceNotification()(msdn)订阅了通知。在处理了一些细节(消息WM_DEVICECHANGE(msdn)等)之后,我就有了DEV_BROADCAST_DEVICEINTERFACE(mssn)结构。

例如,我如何知道插入的设备是手机或相机?

我在谷歌上搜索了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_VIDEOWPD_CONTENT_TYPE_IMAGEWPD_CONTENT_TYPE_FOLDER

另一个框架是Windows图像采集(msdn),但这个东西看不到手机(只有扫描仪,也许还有其他东西,我不知道)。

例如,如果您有一个无线鼠标。当你打开鼠标电源时,它会尝试将自己连接到加密狗或蓝牙等。如果这些设备当前未安装,则必须首先添加它们。触发器在设备链上向后移动,直到电源打开/断开事件由有效的USB驱动程序处理。

然后,每个阶段都必须向USB堆栈添加一个驱动程序来处理该设备。堆栈会朝着最后的终点重新建立起来。您将收到添加到堆栈中的每个usb驱动程序的通知。但是,您将与驱动程序初始化异步地收到通知。因此,无法保证在您收到通知时该设备可以使用。

由于这个原因,在通知时不可能准确地识别添加了哪个设备。但你确实得到了关于这种类型的信息。

找出设备具体是什么的正确方法是枚举机器上的USB设备。但是要小心。如果您快速枚举到,您将错过刚刚添加的设备。

一种可靠的方法是在收到通知后等待几毫秒甚至几秒钟,以枚举机器上的USB设备。例如,如果手机要求将3个驱动程序添加到堆栈中,则您需要等待,直到收到所有3个通知,然后等待,直到初始化了这3个驱动,手机才会显示在枚举中。

枚举包括查找注册表中存在的guid。在驱动程序初始化完成后,才会添加条目,然后驱动程序可以向硬件询问其标识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

是的,这可能会简单得多,但嘿,如果简单的话,每个人都会这么做。

祝你好运!

最新更新