C++ 检测手机或照相机的插入

C++ 检测手机或照相机的插入,c++,winapi,C++,Winapi,我使用::RegisterDeviceNotification()()订阅了通知。在处理了一些细节(messageWM_DEVICECHANGE()等)之后,我有了DEV_BROADCAST_DEVICEINTERFACE()结构 例如,我如何知道插入的设备是移动电话或照相机 我在谷歌上搜索了Windows便携式设备()。可以使用DEV\u BROADCAST\u DEVICEINTERFACE::dbcc\u name作为IPortableDevice::Open()的参数。通过此操作,可以获

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

例如,我如何知道插入的设备是移动电话或照相机

我在谷歌上搜索了Windows便携式设备()。可以使用
DEV\u BROADCAST\u DEVICEINTERFACE::dbcc\u name
作为
IPortableDevice::Open
()的参数。通过此操作,可以获取设备()的“受支持”内容列表,例如:

  • WPD\u内容\u类型\u图像
  • WPD\u内容\u类型\u音频
  • WPD\u内容\u类型\u播放列表
  • WPD\u内容\u类型\u视频
  • WPD\u内容\u类型\u文件
  • WPD\u内容\u类型\u未指定
  • WPD\u内容\u类型\u文件夹
但我不知道,比如说,相机是否只支持
WPD\u CONTENT\u TYPE\u VIDEO
WPD\u CONTENT\u TYPE\u IMAGE
WPD\u CONTENT\u TYPE\u FOLDER


另一个框架是Windows Image Acquisition(),但它看不到移动电话(只有扫描仪,可能还有其他东西,我不知道)。

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

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

由于这个原因,在发出通知时不可能准确地确定添加了哪个设备。但是你可以得到关于类型的信息

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

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

枚举包括查找注册表中存在的GUID。在驱动程序初始化完成之前,不会添加条目,然后驱动程序可以向硬件请求其标识guid。然后将guid插入注册表中。不幸的是,对于不同风格的windows,注册表中的位置是不同的

有关windows7的参考信息,请查看HKLM\SYSTEM\CurrentControlSet\Enum\USB。。。 您将看到一个列表,其中列出了曾经插入该机器的每个设备。每个VID_xxxx和PID_xxxx对都是不同的设备

枚举“活动”并插入计算机的USB设备的最佳方法是通过Windows Management Instrumentation。在驾驶员有时间识别设备后的适当时间触发此操作。然后在枚举回调中检查VID、PID、制造商、设备名称等,看看它是否是您想要的

很抱歉,我找不到Windows SDK示例,但这里有一个很好的起点,它显示了如何枚举USB设备,以查看一个设备是否为XInputDevice。您需要更换vid和pid,并检查您要查找的设备:

是的,这可以简单得多,但是如果它很简单,每个人都会这么做


祝你好运

您是否在问硬件供应商决定支持什么?这就是您获得受支持内容列表的原因。Cach供应商可以选择他们要支持的内容。没有神奇的组合。不,我在问——有没有办法检测手机和摄像头的插入。因为我知道——我不知道如何看待他们之间的差异。据我所知,用户插入设备,它是媒体设备。另一个关键点。如果不让主线程通过GetMessage()/PeekMessage()返回,则驱动程序堆栈可能无法及时可用。您应该设置一些内部倒计时来触发枚举并立即返回。