qt usb热插拔,windows版本,环境qt5.12.9和win10

写文章的目的:

        自己要做windows上的usb通信,但是找遍全网都没找到完整的,虽然有热插拔相关的,但是热插拔的监测不够全面,基本都是只能监测部分的插拔,并且大家都推荐使用libusb库,但是使用了一下该库,哎哟我去,暂时还不支持windows的热插拔监测,难受啊!!!!

        于是,一横心去翻了微软的官网,哈哈,总算是找到了,我这里的所有usb设备都能监测到了。开心啊!!!

下面就是详细教程

 第一步:新建qt项目,然后新建C++类,基类选择QObject;

第二步:添加内容(算了,我直接把我的给你们,方便懒人复制粘贴,不过自己比较一下我给的和刚新建的类差别时什么哈)

头文件如下:

#ifndef USBHOTPLUGDETECTION_H
#define USBHOTPLUGDETECTION_H

#include <QObject>
#include <QAbstractNativeEventFilter>
#include <windows.h>
#include <dbt.h>
#include <QDebug>
class UsbHotplugDetection : public QObject,public QAbstractNativeEventFilter
{
    Q_OBJECT
public:
    explicit UsbHotplugDetection(QObject *parent = nullptr);

signals:
    void signal_USB_Insert();
    void signal_USB_Pullout();
public:
    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
};

#endif // USBHOTPLUGDETECTION_H

 cpp文件如下:

#include "UsbHotplugDetection.h"

UsbHotplugDetection::UsbHotplugDetection(QObject *parent) : QObject(parent)
{

}
bool UsbHotplugDetection::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
    //微软官方文档https://docs.microsoft.com/zh-cn/windows/win32/devio/device-management-events?view=vs-2019
    MSG* msg = reinterpret_cast<MSG*>(message);
    if(msg->message == WM_DEVICECHANGE)// 消息类型, 这里是设备变动;
    {
        switch(msg->wParam)
        {
        case DBT_DEVICEARRIVAL://设备或介质已插入并且变为可用
        {
            emit signal_USB_Insert();
            qDebug("设备或介质已插入并且变为可用");
            break;
        }
        case DBT_DEVICEQUERYREMOVE://请求删除设备或介质的权限。 此消息是应用程序和驱动程序准备进行此删除的最后机会。 但是,任何应用程序都可以拒绝此请求并取消操作。
        {
            qDebug("请求删除设备或介质的权限");
            break;
        }
        case DBT_DEVICEQUERYREMOVEFAILED://取消删除设备或介质块的请求
        {
            qDebug("取消删除设备或介质块的请求");
            break;
        }
        case DBT_DEVICEREMOVECOMPLETE://物理删除设备或介质
        {
            emit signal_USB_Pullout();
            qDebug("物理删除设备或介质");
            break;
        }
        case DBT_DEVICEREMOVEPENDING://删除设备或介质块并且不再可用
        {
            qDebug("删除设备或介质块并且不再可用");
            break;
        }
        case DBT_DEVNODES_CHANGED://向系统添加或删除设备,维护系统中设备列表的应用程序应刷新其列表。
        {
            qDebug("向系统添加或删除设备");
            break;
        }
        case DBT_QUERYCHANGECONFIG://请求 (停靠或取消停靠) 更改当前配置的权限。 任何应用程序都可以拒绝此请求并取消更改。
        {
            qDebug("请求 (停靠或取消停靠) 更改当前配置的权限");
            break;
        }
        case DBT_CONFIGCHANGED://当前配置已更改,因为停靠或取消停靠。 将数据存储在注册表中 HKEY 当前配置项下的应用程序或驱动程序应更新该数据。
        {
            qDebug("当前配置已更改");
            break;
        }
        case DBT_CONFIGCHANGECANCELED://取消对停靠或取消停靠
        {
            qDebug("取消对停靠或取消停靠");
            break;
        }
        default:
        {
            qDebug("其他自定义消息");
            break;
        }
        }
    }
    return false;
}

        说明一下:类继承QObject是为了发送signal;一定要添加继承public QAbstractNativeEventFilter这个类哈;还有就是基本我们热插拔使用的就DBT_DEVNODES_CHANGED(向系统添加或删除设备)这个消息就行了,我发送消息的那两个地方,不靠谱啊,感觉只有存储设备时才有用;还有就是我发现插入设备时DBT_DEVNODES_CHANGED会到来两次,而拔出设备时却只有一次,具体原因还不知道,哪位知道的请求告知一下;

第三步:main.cpp安装事件过滤器

    UsbHotplugDetection *pDisk = new UsbHotplugDetection;
    a.installNativeEventFilter(pDisk);

如有错误之处还请各位告知我一下;

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值