写文章的目的:
自己要做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);
如有错误之处还请各位告知我一下;