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);
}
相关推荐
道清茗10 分钟前
【RH294知识点汇总】第 9 章 《 自动执行 Linux 管理任务 》常见问题
linux·运维·服务器
Flying pigs~~36 分钟前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
misL NITL1 小时前
mysql之如何获知版本
数据库·mysql
许彰午1 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
2401_832365522 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
2301_779622413 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python
丑八怪大丑3 小时前
Java网络编程
linux·服务器·网络
2301_766283443 小时前
c++如何将控制台输出保存到文件_cout重定向到txt【详解】
jvm·数据库·python
北极的冰箱3 小时前
MySQL Ver 8.0.41 for macos14.7密码遗忘
数据库·mysql
橙子也要努力变强3 小时前
信号捕捉底层机制-机理篇2
linux·服务器·c++