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

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

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

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

【问题讨论】:

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

标签: c++ winapi


【解决方案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() 返回,则驱动程序堆栈可能无法及时可用。您应该设置一些内部倒计时来触发枚举并立即返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 2010-10-26
  • 2017-04-24
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多