美文网首页
Qt上USB设备热插拔检测

Qt上USB设备热插拔检测

作者: 厝弧 | 来源:发表于2016-04-11 17:46 被阅读0次

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_OBJECT

public:
 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 ///设备插入或者移除系统,设备节点变化

相关文章

  • Qt上USB设备热插拔检测

    Qt上USB设备热插拔检测 1 头文件 2 示例代码 对于类 Form_usb头文件 对于Form_usb实现文件...

  • android_8.1 hdmi设备热插拔事件

    平时我们对hdmi等设备插拔,只要硬件支持设备热插拔检测,android都有代码检测到,热插拔函数为: frame...

  • Android 检测USB 音频设备

    1.广播检测USB 音频设备 注册广播: 接收广播: USB 设备类型获取请查看UsbInterface.getI...

  • [转] QT USB学习

    转载 QT USB学习USB学习

  • USB 权限申请流程

    USB android授权方式 权限的控制分三块:1:USB host端有个线程循环检测系统是否USB设备插拔,如...

  • Linux驱动系列———USB转串口cp210x设备驱动

    USB设备驱动程序用来驱动相应的USB设备,USB设备驱动用usb_driver表示,它主要用来将USB设备挂接到...

  • Android之USB数据通信

    一.USB串口通信步骤: 连接USB设备 获取USB设备的权限 打开设备openDevice(UsbDevice ...

  • arduino连接电脑无反应

    USB连接连接电脑之后,设备管理器检测不到这个新的设备,但是板子上的电源指示灯常亮,L灯闪烁。 解决办法:将ard...

  • 基于qt的实时投屏

    一、项目简介 基于qt的实时投屏,通过usb、tcp或者ip来连接安卓设备 二、实现功能 视频解码 视频渲染 跨平...

  • 金笛短信猫指示灯不亮

    可能原因: ①如果是串口设备,可能没有供上电 ②如果是USB口设备,可能USB线没连好,或电脑没启动 ③设备故障 ...

网友评论

      本文标题:Qt上USB设备热插拔检测

      本文链接:https://www.haomeiwen.com/subject/kpyilttx.html