检测手机或相机的插入

Posted

技术标签:

【中文标题】检测手机或相机的插入【英文标题】:Detect insertion of mobile phone or camera 【发布时间】:2014-02-09 01:48:46 【问题描述】:

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

我怎么知道插入的设备是手机还是相机?

我搜索了 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 Image Acquisition(msdn),但是这个东西看不到手机(只有扫描仪,可能还有别的,我不知道)。

【问题讨论】:

您是在问硬件供应商决定支持什么?这就是您获得支持内容列表的原因。缓存供应商可以选择他们要支持的内容,没有神奇的组合。 不,我在问 - 有没有办法检测手机和相机的插入。因为正确知道 - 我不知道如何看到他们之间的差异。我所知道的是用户插入设备并且它是一个媒体设备.. 【参考方案1】:

例如,如果您有无线鼠标。当您打开鼠标电源时,它会尝试将自己连接到加密狗或蓝牙等。如果当前未安装这些设备,则必须首先添加它们。触发器在设备链上向后退一步,直到电源开/关事件由有效的 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,并检查您要查找的设备:http://msdn.microsoft.com/en-us/library/windows/desktop/ee417014(v=vs.85).aspx

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

祝你好运!

【讨论】:

另一个关键点。如果您不让主线程通过 GetMessage() / PeekMessage() 返回,则驱动程序堆栈可能无法及时可用。您应该设置一些内部倒计时来触发枚举并立即返回。

以上是关于检测手机或相机的插入的主要内容,如果未能解决你的问题,请参考以下文章

使用Android相机进行人脸检测。?

vivo手机wifi测试代码

MacOS - 检测相机何时打开/关闭

Android:BroadcastReceiver 意图检测拍摄的相机照片?

如何测量物体或人脸与相机的距离

Android - 如何防止按下音量或相机键时手机屏幕打开?