Qt动态监测USB插拔事件

需要引用头文件

cpp 复制代码
#include <windows.h>
#include <dbt.h>

Qt4用

bool winEvent(MSG *m, long *result);

bool winEventFilter(MSG *m, long *result);

例如:

cpp 复制代码
bool USBTest::winEvent(MSG *m, long *result)
{

	int msgType = m->message;
	if (msgType == WM_DEVICECHANGE) {
		PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)m->lParam;
		switch (m->wParam) {
		case DBT_DEVICEARRIVAL:
			if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
				PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
				if (lpdbv->dbcv_flags == 0) {
					//QString USBDisk = QString(this->FirstDriveFromMask(lpdbv->dbcv_unitmask));
					//emit sigUDiskCome(USBDisk);
				}
			}
			break;
		case DBT_DEVICEREMOVECOMPLETE:
			if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
				PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
				if (lpdbv->dbcv_flags == 0) {
					//emit sigUDiskRemove();
				}
			}
			break;
		case DBT_DEVNODES_CHANGED:
			{
				qDebug() << "USB_change";
			}
			break;
		default:
			break;
		}
	}
	return QWidget::winEvent(m,result);
}

Qt5用

bool nativeEvent(const QByteArray &eventType, void *message, long *result);

bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);

例如:

cpp 复制代码
bool USBDisk::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
	MSG* msg = reinterpret_cast<MSG*>(message);
	int msgType = msg->message;
	if (msgType == WM_DEVICECHANGE)
	{
		PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
		switch (msg->wParam) {
		case DBT_DEVICEARRIVAL:
			if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
			{
				PDEV_BROADCAST_DEVICEINTERFACE pDevInf = PDEV_BROADCAST_DEVICEINTERFACE(lpdb);
				QString device_name = "插入设备(name):" + QString::fromWCharArray(pDevInf->dbcc_name, int(pDevInf->dbcc_size)).toUtf8();

				emit sigUDiskCome(device_name);
				qDebug() << device_name;
			}
			break;
		case DBT_DEVICEREMOVECOMPLETE:
			if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
			{
				PDEV_BROADCAST_DEVICEINTERFACE pDevInf = PDEV_BROADCAST_DEVICEINTERFACE(lpdb);
				QString device_name = "移除设备(name):" + QString::fromWCharArray(pDevInf->dbcc_name, int(pDevInf->dbcc_size)).toUtf8();

				emit sigUDiskRemove();
				qDebug() << device_name;
			}
			break;
		case DBT_DEVNODES_CHANGED:
		{
			qDebug() << "USB_change";
		}
		break;
		}
	}
	return QWidget::nativeEvent(eventType, message, result);
}
相关推荐
m0_462605223 分钟前
大模型week02
数据库
我不是疯子是傻子10 分钟前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
DBA_G17 分钟前
GBase 8a数据库集群多维度资源管控策略矩阵解析
数据库·oracle
程序员老陆19 分钟前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
立少→万能汉编22 分钟前
用“立少→超文本”写静态网页,标签<倍>
服务器·前端·javascript
逐米时代1 小时前
智能招聘与人岗匹配:可解释匹配让录用依据有迹可循
大数据·数据库·人工智能
承渊政道1 小时前
KES专业技能包发布:覆盖数据库开发、迁移与运维全流程
运维·数据库·gitee·数据库开发·金仓数据库
笨鸟先飞,勤能补拙1 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
IvorySQL2 小时前
PostgreSQL 日报| RI 快速路径并发读取缺陷(8 月 13 日)
数据库·postgresql
佳児素花痴╮2 小时前
网络问题与基础理论
运维·服务器·网络