前言

在项目中,遇到一个需求:需要动态监测U盘插入,自动读取U盘文件并打开。为了实现这个功能,我们可以使用RegisterDeviceNotification注册设备事件的通知,

然后在程序中处理WM_DEVICECHANGE消息来实现

步骤

RegisterDeviceNotification注册设备事件的通知

在QWidget中重新实现它的nativeEvent函数来接收处理WM_DEVICECHANGE消息

具体代码

bool GlobalUtil::registerDevNitification(QWidget *widget)

{

static const GUID GUID_DEVINTERFACE_LIST[] =

{

{ 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },

{ 0x53f56307, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },

{ 0x4D1E55B2, 0xF16F, 0x11CF,{ 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },

{ 0xad498944, 0x762f, 0x11d0,{ 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }

};

HDEVNOTIFY hDevNotify;

DEV_BROADCAST_DEVICEINTERFACE NotifacationFiler;

ZeroMemory(&NotifacationFiler, sizeof(DEV_BROADCAST_DEVICEINTERFACE));

NotifacationFiler.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);

NotifacationFiler.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

for (int i = 0; i < sizeof(GUID_DEVINTERFACE_LIST) / sizeof(GUID); i++)

{

NotifacationFiler.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];

hDevNotify = RegisterDeviceNotification((HANDLE)widget->winId(), &NotifacationFiler, DEVICE_NOTIFY_WINDOW_HANDLE);

if (!hDevNotify)

{

return false;

}

}

return true;

}

// 将需要处理WM_DEVICECHANGE消息的widget进行注册

GlobalUtil::registerDevNitification(widget);

// 在widget中重新实现nativeEvent函数

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

{

MSG* msg = reinterpret_cast(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)

{

m_callback++;

if (m_callback % 2 == 0)

{

// 具体的业务处理

}

}

break;

}

}

return false;

}

其他补充

看到上边,采用了一个m_callback标志位进行限制,这是因为U盘插入后,会连续发送两次WM_DEVICECHANGE消息,但我们业务处理只需要进行一次即可,因此通过该标志位进行限定

linux qt检测u盘热插拔,【QT】动态监测U盘插拔相关推荐

  1. linux下usb的热插拔监控,怎么linux下检测 usb摄像头热插拔事件

    在linux下所有设备都是文件.所以对摄像头的操作其实就是对文件的操作.USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头).在linux下操作摄像头就是使用v4l2对摄像头 ...

  2. 耳机驱动调试(插拔检测与按键检测)

    耳机驱动调试(插拔检测与按键检测) 小白一枚,欢各位大佬指出错误 耳机类型判断 三段和四段.欧标和美标 现在许多设备的耳机接口都采用3.5mm的耳机接口,其中终端就是,终端可以兼容三段和四段耳机:三段 ...

  3. 计算机如何设置u盘图标,如何将U盘的图标改成自己喜欢的图案,程序员:这段代码拿去试试...

    如今电脑已经成为了人们生活和工作中不可或缺的一个角色了,基本上家家户户都会配上一台电脑了,电脑的存在帮助我们提高了很大的工作效率,当工作中或者学习中需要传输一些文件的时候,有很多工具可以使用,而一般比 ...

  4. qt linux不能读写u盘文件,Qt读取U盘文件内容

    欢迎大家关注.收藏,方便下次阅读! 之前想做的一个功能是读取U盘中的文件到系统磁盘目录下,今天抽空把简版功能实现了.那会儿一直搜索的Qt如何识别U盘,最终得到的结果是Qt检测U盘插拔,发现并不是我想要 ...

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

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

  6. linux U盘插拔检测

    因为最终要在tiny210上实现此功能,最终选择了hotplug. http://hi.baidu.com/hdy5200075/item/7751f48647f3d12a100ef3f6这里是hot ...

  7. Linux USB U盘热插拔挂载和卸载

    一.硬件平台 1.  控制器:MT7620(A9内核) 2.  RTC芯片:MCP7940 二.软件平台 1.开发环境:Ubuntu12.04 2.SDK内核包:MT7620 SDK软件开发包(Med ...

  8. Qt 嵌入式设备应用程序,通过U盘升级的一种思路

    最近在做一个通过U盘升级的功能,程序是运行在ARM Linux Qt平台上的.这个应该是很多嵌入式设备必备的一个功能了,所以把这部分的实现抽出来,做成一个例子供需要的人参考.这只是U盘升级的一种思路, ...

  9. 树莓派linux编译不了动态库,linux系统下的树莓派与Qt 5.12.3源码的交叉编译

    {写在前面:按照这个方法,基本可以成功在linux系统下交叉编译Qt5.12.3,其他版本的源码也编译} 我的环境:Linux Mint 19.1;树莓派 3;Qt源码5.12.3 当两个系统全部安装 ...

最新文章

  1. AdminStudio功能模块与版本信息总结
  2. TikTok又添劲敌 Meta元宇宙携Reels宣战
  3. Python 中 pass的使用
  4. ftp 文件服务器预览,web文件服务器 ftp 预览
  5. Ajax基本案例详解之$.get的实现
  6. [转] UML中关联、依赖、聚集等关系的异同
  7. ubuntu 在线安装最新交叉编译工具
  8. Java 根据 Map 的 key 的 ASCII 码从小到大排序
  9. 实时全局光照Screen Space Reflection (SSR)
  10. python转bat_bat 转换为python
  11. 微信小游戏跳一跳外挂辅助程序
  12. react 实现tab切换 三角形筛选样式
  13. 关于指令test ecx,ecx
  14. 网络硬件三剑客 - 集线器、交换机与路由器
  15. gulp4.0的坑:提示: Error: watching index.html: watch task has to be a function (optionally generated by u
  16. 查询7日内的展示数据
  17. 连推“一案一策”成都人工智能产业“换道超车
  18. 基于51单片机的宠物自动猫粮狗粮喂养机proteus仿真原理图PCB
  19. 捋一捋人工智能(AI)、机器学习(ML)、深度学习(DL)之间的关系
  20. 当下最受欢迎的编辑器,赶紧用起来!

热门文章

  1. 皮一皮:追忆我那随风逝去的阔腿裤...
  2. IDEA不能一个窗口管理多个项目?那是你不会用!
  3. Spring Cloud 常见面试题及答案
  4. Chrome 开发者工具的各种骚技巧
  5. 死磕Java并发:J.U.C之并发工具类:CountDownLatch
  6. html里range怎么改样式,CSS之修改input range样式 [ lion1ou ]
  7. explain mysql 调优_explain mysql性能优化
  8. java求数组中满足给定和的数对,【加试题】数组a中有50个互异的整数,已按升序排列。给定一个正整数key,寻找数组a中是否有一对数的和等于给定的数key,算法如下:...
  9. php操作mysql数据库的扩展有哪些_8.PHP操作MySQL数据库(Mysqli扩展)
  10. 平面法向量,点云法向量估计及可视化