(使用版本为5.12.0)

需要的头文件有以下:

#include <windows.h>
#include <dbt.h>
#include <devguid.h>
#include <setupapi.h>
#include <initguid.h>

第一步:

注册插拔事件

    static const GUID GUID_DEVINTERFACE_LIST[] ={// GUID_DEVINTERFACE_USB_DEVICE{ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },
//    // GUID_DEVINTERFACE_DISK
//    { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },
//    // GUID_DEVINTERFACE_HID,
//    { 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
//    // GUID_NDIS_LAN_CLASS
//    { 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } },
//    // GUID_DEVINTERFACE_COMPORT
//    { 0x86e0d1e0, 0x8089, 0x11d0, { 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73 } },
//    // GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
//    { 0x4D36E978, 0xE325, 0x11CE, { 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } },
//    // GUID_DEVINTERFACE_PARALLEL
//    { 0x97F76EF0, 0xF883, 0x11D0, { 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C } },
//    // GUID_DEVINTERFACE_PARCLASS
//    { 0x811FC6A5, 0xF728, 0x11D0, { 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1 } },};//注册插拔事件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];//GetCurrentUSBGUID();hDevNotify = RegisterDeviceNotification(HANDLE(this->winId()),&NotifacationFiler,DEVICE_NOTIFY_WINDOW_HANDLE);if(!hDevNotify){GetLastError();qDebug() << "注册失败" <<endl;}}

第二步:

  1. 在Qt5中已经使用nativeEvent代替掉了winEvent.(都是QWidget中的虚函数,用于接收活跃的事件,就比如鼠标的移动、触发等等,这里最重要的当然是设备插拔)
  2. 重写nativeEvent函数(是QWidget的虚函数)
bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{MSG* msg = reinterpret_cast<MSG*>(message);//第一层解算UINT 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();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();qDebug()<< device_name;}break;}}return false;
}

参考自:

https://blog.csdn.net/mhpmii/article/details/50240809

https://blog.csdn.net/qq61394323/article/details/45697329

QT在windows上检测USB端口插拔相关推荐

  1. QT在Windows下检测USB设备热拔插的思路

    一.问题描述: 使用QT开发视频会议时需要实现实时检测USB摄像头/麦克风拔插的功能,这里主要涉及到对一些Windows API的了解以及windows系统的设备管理识别不同种设备时的原理,在实现过程 ...

  2. java 监控usb端口插拔_监控USB设备插拔

    最近做了UKey加密中设计到USB设备. 因UKEy是用来加密和执行PC与项目间通信加密的介质.从作用范围来讲不是传统意义上U盘作为存储介质来使用.其实熟悉网银驱动DR应该了解.在网银系统安全上一个最 ...

  3. 使用libusb检测USB设备插拔状态

    libusb是一个提供USB设备访问的跨平台用户模式程序库.该项目最新网址:http://www.libusb.info, 支持主流的操作系统:Linux.Mac OS X. Windows.Open ...

  4. java 监控usb端口插拔_如何监控某种类型的USB设备的插拔?

    用System.Managment class 试试 下面是我在网上找到的代码 出处 http://www.eggheadcafe.com/software/aspnet/31850441/c-usb ...

  5. nodejs (usb)连接打印机 获取打印状态(escpos-printer和node-escpos)检测USB端口的热插拔

    本文可以提供: 1.检测USB端口的热插拔 2.打印机状态获取(escpos-printer和node-escpos) 3.USB进行数据交互. 问题: nodejs使用escpos-printer框 ...

  6. sim插拔识别时间_一种sim卡检测装置及其检测sim卡插拔的方法

    一种sim卡检测装置及其检测sim卡插拔的方法 [技术领域] [0001]本发明涉及移动通讯设备领域,尤其涉及一种S頂卡检测装置及其检测S頂卡插拔的方法. [背景技术] [0002]S頂卡是移动终端中 ...

  7. 关于iar加st-link,报出SWIM error [30200]错误,我自己处理的方法,usb重新插拔

    关于iar加st-link,报出SWIM error [30200]错误,我自己处理的方法,usb重新插拔

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

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

  9. 模拟usb重新插拔_Android 10带来黑科技 检测手机USB接口是否有液体或者是否过热...

    谷歌昨天正式发布Android 10手机操作系统,同时谷歌全系列三代Pixel智能手机均可升级到Android 10正式版,而参与Android beta测试项目的智能手机厂商也同时为旗下部分智能手机 ...

最新文章

  1. Android 和 Chrome OS 融合的可能性
  2. IO 模型知多少 | 代码篇
  3. 应该把script标签放在哪里
  4. android 调用restful,android调用springmvc写的restful
  5. 数据表格应该这样设计
  6. labview的IMAQ中sanp和grab有什么不同
  7. springboot中的注解-EnableConfigurationProperties
  8. 蚂蚁分类信息使用心得
  9. 搭建开源物联网平台教程
  10. app运营中,如何提高用户活跃度?
  11. [江枫]用Amoeba构架MySQL分布式数据库环境
  12. 服务器维护 灵魂兽,魔兽世界7.0新灵魂兽麋鹿捕捉方法
  13. 被放逐的皇后 金建云
  14. 【Vue3.0移动端项目--旅游网】-- 房屋详情页创建以及房屋详情图片展示
  15. 大疆aeb连拍_给无人机新手的3个航拍技巧,入门机也能拍大片!
  16. MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
  17. html 自适应单位vw,CSS3响应式自适应尺寸视窗单位vw、vh详解
  18. 豪斯医生改名换姓上演《我的“钱”半生》?
  19. 对于LSM Tree写放大问题的一些浅薄学习
  20. Scratch(二十一):开船钓鱼

热门文章

  1. 2022最火土味情话文案
  2. 人在江湖走,谁能不忘事
  3. Thinkpad E550/E450/T450/T450S黑苹果制作
  4. 能自动摊铺施工的公路滑模机多少钱一台
  5. JavaScript原生实现广告栏滑动
  6. 关于平行四边形判断问题
  7. linux内核zfs,Linus Torvalds回应用户抱怨:不建议使用 ZFS On Linux
  8. 尚硅谷-ShardingSphere
  9. 某电商平台数据分析报告(2)
  10. lambda表达式的3种写法