一、问题描述:
使用QT开发视频会议时需要实现实时检测USB摄像头/麦克风拔插的功能,这里主要涉及到对一些Windows API的了解以及windows系统的设备管理识别不同种设备时的原理,在实现过程中主要参考了以下两篇文章以及微软开发手册。
监测硬件的插入或者拔除https://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal Windows下检测usb设备拔插的demohttps://blog.csdn.net/explorer114/article/details/50563051
本文将着重讲解windows识别设备所需的基础概念和原理以及在实现过程中对于上述参考文章需要修改的地方。
二、基本概念
1.windows下常见的设备类型有哪些?
从图2-1 设备管理器的截图中,我们可以看到常见的设备类型有监视器,键盘,鼠标,音频输入和输出,照相机等等,然后我们点击其中一个设备类型就可以看见下面具体连接的设备。
图2-1 设备管理器
2.windows是如何归类一个设备和标识一个设备类型的呢?
微软提出一个概念叫做设备安装类(Setup Class),为了简化设备的安装过程,windows会将以相同方式设置和配置的设备分组为一个设备安装类,比如,windows将所有的网卡(PCI网卡/无线网卡/外接USB网卡)都归到网络适配器一类。为了区分不同的设备安装类,每一个设备安装类都关联了一个GUID,系统定义的安装类Guid是在devguid.h中定义的,并且通常具有GUID_DEVCLASS_Xxx的格式的符号名称。具体可以参考下面微软官方的解释。
Overview of Device Setup Classes - Windows drivers | Microsoft DocsOverview of Device Setup Classeshttps://docs.microsoft.com/en-us/windows-hardware/drivers/install/overview-of-device-setup-classes从图2-2 devguid.h中我们可以看到所有设备安装类的guid,比如电池设备,蓝牙设备的guid等等,在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class 下可以查看到设备安装类GUID
图 2-2 devguid.h
还有一个与之相对应的概念叫做设备接口类(Device Interface Class),顾名思义,设备对外的接口,用于设备的管理和访问操作,系统对设备的状态进行跟踪。
驱动程序可以注册一个设备接口类,然后向每个可能向其发送用户模式I/O请求的设备对象启用该类的实例,当驱动程序注册设备接口类的实例时,I/O管理器将设备和设备接口类GUID与符号链接名称相关。符号链接名称存储在注册表中,使用该接口的应用程序可以查询该接口的实例并接收表示支持该接口的设备的符号链接名称,然后应用程序就可以使用符号链接名称作为I/O请求的目标。
每个设备接口类都与一个GUID相关联。系统在设备特定的头文件中为通用设备接口类定义GUID,供应商可以创建额外的设备接口类。例如,三种不同类型的鼠标