要做这个,要先知道Qt的QAbstractNativeEventFilter类,虚函数nativeEventFilter。这个类的主要作用是捕获全局windows消息。

先看一下效果

基本注意以下两点:

1、新建的类要继承

QAbstractNativeEventFilter

2、新建的类要被安装事件过滤,比如:

qApp->installNativeEventFilter(QAbstractNativeEventFilter *filterObj);

这里我封装了一个简单的类uDisk:

①头文件

#ifndef UDISK_H
#define UDISK_H
#include <QWidget>
#include <windows.h>
#include <QAbstractNativeEventFilter>
#include <dbt.h>
class uDisk : public QWidget, public QAbstractNativeEventFilter
{Q_OBJECT
protected:bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
signals:void sigUDiskCome(QString uDiskName);void sigUDiskRemove();
private:char FirstDriveFromMask(ULONG unitmask);
};
#endif // UDISK_H

②源文件

#include "uDisk.h"
#include <QApplication>
#include <QDebug>
char uDisk::FirstDriveFromMask(ULONG unitmask)
{char i;for (i = 0; i < 26; ++i) {if (unitmask & 0x1) {break;}unitmask = unitmask >> 1;}return (i + 'A');
}
bool uDisk::nativeEventFilter(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_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:break;default:break;}}return QWidget::nativeEvent(eventType, message, result);
}

如何使用:

1、引用头文件#include "uDisk.h"

2、声明uDisk *m_uDisk = Q_NULLPTR;

3、调用:

 m_uDisk = new uDisk;qApp->installNativeEventFilter(m_uDisk);connect(m_uDisk, &uDisk::sigUDiskCome, [=](QString uDiskName){ui->label->setText(tr("U Disk Come!").append(tr("The Disk is ") + uDiskName));});connect(m_uDisk, &uDisk::sigUDiskRemove, [=](){ui->label->setText(tr("U Disk Remove!"));});

4、在调用类析构时记得析构掉:

  if(m_uDisk) {delete m_uDisk;m_uDisk = Q_NULLPTR;}

Qt检测U盘插入拔出Demo相关推荐

  1. Windows下使用Qt检测U盘插入和拔出的示例Demo程序

    本文转载自Qt检测U盘插入拔出Demo 要做这个,要先知道Qt的QAbstractNativeEventFilter类,虚函数nativeEventFilter.这个类的主要作用是捕获全局window ...

  2. vbs脚本——检测U盘插入拨出并通过邮件报警

    自己复制粘贴和修改的,很多做网管的朋友应该会用得上,里面锁定操作的小程序是自己用VB写的,很不完善,就不拿出来献丑了~~~ 报警邮件内容包括电脑的IP.计算机名.域用户名'############## ...

  3. 监听U盘插入 拔出 消息,获得U盘盘符

    目录 一.U盘插拔消息监听 1.顶层窗口监听WM_DEVICECHANGE消息 2.WM_DEVICECHANGE 详细参数描述

  4. 在.NET中探测U盘的插入/拔出

    当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用 ...

  5. iphone检测耳机插入/拔出

    iphone检测耳机插入/拔出 开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iT ...

  6. [iOS] iphone检测耳机插入/拔出

    开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iTouch和iPad等本身不带麦克 ...

  7. VB中简便的检测U盘插拔的方法(DriveListBox)

    我在网上找了很多资料,实现检测U盘插拔的方法基本上都是监测WM_DEVICECHANGE.这种方法不但臃肿,而且效率不高,很容易出错.于是我摸索出了一种新的方法,以下就是实现过程. 首先在窗体中添加一 ...

  8. U盘强制拔出数据丢失怎么办

    一般要从电脑上拷贝数据的时候,就会需要将U盘插入到电脑上,从而进行数据拷贝,但是U的时候要拔出U盘的时候任务没有结束,有的人就会将U盘强制拔出,那么万一造成数据丢失,要怎么恢复呢? 要恢复U盘里面的数 ...

  9. 查询计算机u盘记录时间,怎么通过系统日志查看u盘的拔出时间

    通过系统日志查看u盘的拔出时间的方法:首先打开控制面板并找到计算机管理,往系统里面添加环境变量[devmgr_shownonpresent_devices],值为1:然后打开计算机管理,把可移动存储相 ...

最新文章

  1. C++程序设计-第九周分支结构程序设计上机实践项目
  2. 线性表之链式存储结构
  3. 孝敬父母 天经地义 |有人这么疑问?
  4. 做一名真正的软件工程师
  5. nginx 源码学习笔记(十)——基本容器——ngx_hash
  6. Linux:文件描述符
  7. 629. K个逆序对数组
  8. python面试技巧和注意事项_Python 程序员面试须知须会的5个问题
  9. ROS调用ORB-SLAM2
  10. OCA读书笔记(8) - 管理用户安全
  11. 【16】成对使用new和delete时要采取相同形式
  12. Testing Flutter apps翻译-使用 Mockito 模拟依赖项
  13. linux 删除文件的最后一行
  14. sensitivity和specificity
  15. 【有福利,手慢无】相册网送您免费洗50张照片
  16. 如何突出照片中的人物
  17. 《我也能做CTO之程序员职业规划》之十六:逆商
  18. 情境领导者-第七章、解决绩效问题
  19. 人机融合系统的休谟之问到工业智能的成熟应用的联想
  20. 回首2015年小文codeRoad

热门文章

  1. 在 yoga pro 14s 2022 上安装 Ubuntu 20.04.6
  2. 计算机视觉的定义,应用及整个系统
  3. Improving the Efficiency of Grammatical Error Correction with Erroneous Span Detection翻译
  4. ️ 如何绕过 BKY 对 script 的屏蔽
  5. 一文看清六西格玛和精益生产的9个区别 -优思学院
  6. TMS320F28x上RTOS移植关键技术分析
  7. python发微信红包群二维码_「微信红包」通过爬虫来全自动抢微博红包的思路
  8. 关于gitlab拉代码和传代码
  9. 使用Python爬取微信群里的百度云资源
  10. 电缆故障监测vr虚拟仿真教学软件的好处