QT在Windows下检测USB设备热拔插的思路

一、问题描述:

使用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

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中实现USB检测,可以使用QDeviceWatcher类。QDeviceWatcher是一个用于监测设备插入和移除事件的类。 首先,确保在项目文件(.pro)中添加以下内容以启用Qt的udev库: ```cpp LIBS += -ludev ``` 然后,可以按照以下步骤在Qt中实现USB检测: 1. 在头文件中包含必要的头文件: ```cpp #include <QObject> #include <QDeviceWatcher> ``` 2. 创建一个类并继承自QObject: ```cpp class USBWatcher : public QObject { Q_OBJECT public: explicit USBWatcher(QObject *parent = nullptr); private slots: void deviceAdded(const QString &devPath); void deviceRemoved(const QString &devPath); private: QDeviceWatcher *m_deviceWatcher; }; ``` 3. 在实现文件中定义构造函数,并在构造函数中初始化QDeviceWatcher对象,并连接相应的槽函数: ```cpp USBWatcher::USBWatcher(QObject *parent) : QObject(parent) { m_deviceWatcher = new QDeviceWatcher(this); connect(m_deviceWatcher, SIGNAL(deviceAdded(QString)), this, SLOT(deviceAdded(QString))); connect(m_deviceWatcher, SIGNAL(deviceRemoved(QString)), this, SLOT(deviceRemoved(QString))); m_deviceWatcher->start(); } ``` 4. 实现设备插入和移除的槽函数: ```cpp void USBWatcher::deviceAdded(const QString &devPath) { // 处理设备插入事件 qDebug() << "Device added: " << devPath; } void USBWatcher::deviceRemoved(const QString &devPath) { // 处理设备移除事件 qDebug() << "Device removed: " << devPath; } ``` 5. 在你的应用程序中实例化USBWatcher对象,并将其保持活动状态: ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); USBWatcher usbWatcher; return app.exec(); } ``` 通过以上步骤,你现在可以在`deviceAdded()`和`deviceRemoved()`槽函数中处理设备插入和移除事件。你可以根据需求来执行一些自定义的操作,比如更新UI或者执行特定的任务。 请注意,USB检测需要在具有相应权限的操作系统上运行,如Linux。在不同的操作系统和平台上,可能需要使用不同的方法来实现设备监测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值