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);
}
相关推荐
leona_nuaa5 分钟前
p2p虚拟服务器
服务器·网络协议·p2p
为自己_带盐19 分钟前
浅聊一下数据库的索引优化
开发语言·数据库·php
wangchen_019 分钟前
linux-信号保存和处理
linux·运维·服务器
Chandler2433 分钟前
Go 语言 net/http 包使用:HTTP 服务器、客户端与中间件
服务器·http·golang
gb42152871 小时前
mysql数据库中某个数据表的碎片率自己降低了,mysql数据表对碎片率有自动优化机制吗?
数据库·mysql
AI大模型顾潇1 小时前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
有时间要学习1 小时前
MySQL——数据类型&&表的约束
数据库·mysql
wgc2k1 小时前
Java游戏服务器开发流水账(5)Spring 在游戏开发中的使用简介
java·服务器·游戏
AI改变未来1 小时前
数据库常见故障排查
数据库
bing_1581 小时前
MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?
数据库·mongodb·oracle