Qt上USB设备热插拔检测
来源:互联网 发布:手机设置添加网络ssid 编辑:程序博客网 时间:2024/05/21 08:51
Qt上USB设备热插拔检测1 头文件#include <QWidget>#include <dbt.h>#include <windows.h>2 示例代码对于类 Form_usb头文件#ifndef FORM_USB_H#define FORM_USB_H#include <QWidget>#include <windows.h>#include <QString>#include <dbt.h>#include <QDebug>namespace Ui {class Form_usb;}class Form_usb : public QWidget{ Q_OBJECTpublic: explicit Form_usb(QWidget *parent = 0); ~Form_usb();protected: bool nativeEvent(const QByteArray &eventType, void *message, long *result);private: Ui::Form_usb *ui;private: //UsbConfig usbConfig; char FirstDriveFromMask (ULONG unitmask);};#endif // FORM_USB_H对于Form_usb实现文件#include "form_usb.h"#include "ui_form_usb.h"Form_usb::Form_usb(QWidget *parent) : QWidget(parent), ui(new Ui::Form_usb){ ui->setupUi(this);}Form_usb::~Form_usb(){ delete ui;}bool Form_usb::nativeEvent(const QByteArray &eventType, void *message, long *result){ Q_UNUSED(eventType); MSG* msg = reinterpret_cast<MSG*>(message); int msgType = msg->message; if(msgType == WM_DEVICECHANGE) { qDebug() << "Recv Event " ; PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam; switch(msg->wParam) { case DBT_DEVICETYPESPECIFIC: { qDebug() << "DBT_DEVICETYPESPECIFIC " ; break; } case DBT_DEVICEARRIVAL: if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags == 0) { // 插入U盘,此处可以做你想做的事 // lpdbv->dbcv_unitmask 即盘符标志位,1bit,0为A,1为B,10为C,11为D…以此类推 QString USBDisk = QString(this->FirstDriveFromMask(lpdbv->dbcv_unitmask)); qDebug() << "USB_Arrived and The USBDisk is: "<<USBDisk ; } } qDebug() << "DBT_DEVICEARRIVAL" ; break; case DBT_DEVICEREMOVECOMPLETE: if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags == 0) { qDebug() << "USB_delete"; } } qDebug() << "DBT_DEVICEREMOVECOMPLETE" ; break; } } return false;}char Form_usb::FirstDriveFromMask(ULONG unitmask){ char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return (i + 'A');}3. 进一步说明主要是实现bool nativeEvent(const QByteArray &eventType, void *message, long *result);函数,来对设备的插拔事件进行监控。以上函数在Qt 5以上版本中受支持,其他版本使用的是函数bool winEvent(MSG *message, long *result);。对于部分事件类型现解释如下:#define DBT_NO_DISK_SPACE 0x0047 #define DBT_LOW_DISK_SPACE 0x0048#define DBT_CONFIGMGPRIVATE 0x7FFF#define DBT_DEVICEARRIVAL 0x8000 ///一个设备或者"piece of media" 已经插入并且有效#define DBT_DEVICEQUERYREMOVE 0x8001 ///移除设备需要请求权限,任何设备可以忽略并取消该请求#define DBT_DEVICEQUERYREMOVEFAILED 0x8002 ///取消移除设备的请求#define DBT_DEVICEREMOVEPENDING 0x8003 ///设备将会移除,不能被忽略#define DBT_DEVICEREMOVECOMPLETE 0x8004 ///设备移除#define DBT_DEVICETYPESPECIFIC 0x8005#define DBT_CUSTOMEVENT 0x8006 ///用户事件发生#define DBT_DEVTYP_OEM 0x00000000#define DBT_DEVTYP_DEVNODE 0x00000001#define DBT_DEVTYP_VOLUME 0x00000002 ///逻辑卷标事件触发#define DBT_DEVTYP_PORT 0x00000003#define DBT_DEVTYP_NET 0x00000004#define DBT_DEVTYP_DEVICEINTERFACE 0x00000005#define DBT_DEVTYP_HANDLE 0x00000006#define DBT_DEVNODES_CHANGED 0x0007 ///设备插入或者移除系统,设备节点变化
阅读全文
0 0
- Qt上USB设备热插拔检测
- Windows上USB设备检测
- 在 QT 中使用 libusb 检测 MAC 上的 USB 设备
- USB 设备热插拔的检测
- USB 设备热插拔的检测
- linux下USB设备热插拔如何检测
- 检测USB设备
- usb设备如何检测
- windos下QT实现usb热插拔检测
- Qt MFC支持USB设备热插拔
- Linux下USB设备检测
- Linux下USB设备检测
- Linux下USB设备检测
- Linux下USB设备检测
- Linux下USB设备检测 .
- Linux 系统USB设备检测
- USB设备的插入检测
- USB设备的插入检测
- uiimageView 的图片拉伸问题的解决办法
- 补档-阿里云部署常用步骤以及问题
- laravel之表单篇
- 大话企业IT安全解决方案
- mybatis的缓存机制
- Qt上USB设备热插拔检测
- SPI协议介绍
- SSRS 页面滚动条下拉时固定table表头
- 私立小学校の入試速報
- Mac图片处理工具
- Oracle参数“”_db_block_check_objtyp”
- C#很小的知识点
- Java对象数组练习
- SAP HANA HDB序列的使用方法及技巧(SAP HANA HDB SEQUENCE )