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);
}
相关推荐
不良人天码星14 小时前
redis的事务,以及watch的原理
数据库·redis·缓存
TG_yunshuguoji14 小时前
亚马逊云代理商:AWS怎么通过加密实现数据保护目标?
服务器·云计算·aws
可涵不会debug14 小时前
UU远程深度测评:重构远程控制体验的“无套路”标杆
运维·服务器
韩立学长14 小时前
基于微信小程序的公益捐赠安全平台9hp4t247 包含完整开发套件(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·微信小程序·小程序
智能化咨询14 小时前
SQL之参数类型讲解——从基础类型到动态查询的核心逻辑
数据库·oracle
doris820414 小时前
使用Yum安装Redis
数据库·redis·缓存
有一个好名字14 小时前
万字 Apache ShardingSphere 完全指南:从分库分表到分布式数据库生态
数据库·分布式·apache
峰顶听歌的鲸鱼14 小时前
1.云计算与服务器基础
运维·服务器·笔记·云计算·学习方法
Boilermaker199214 小时前
【Redis】哨兵与对脑裂的情况分析
数据库·redis·缓存
IDOlaoluo14 小时前
dotnet-sdk-5.0.400-linux-x64.tar.gz 安装教程(Linux 手动安装 .NET 5.0.400 SDK 步骤)
运维·服务器