Qt上USB設(shè)備熱插拔檢測

Qt上USB設(shè)備熱插拔檢測

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實現(xiàn)文件

#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 即盤符標(biāo)志位,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. 進一步說明

主要是實現(xiàn)bool nativeEvent(const QByteArray &eventType, void *message, long *result);函數(shù)后豫,來對設(shè)備的插拔事件進行監(jiān)控挫酿。以上函數(shù)在Qt 5以上版本中受支持,其他版本使用的是函數(shù)
bool winEvent(MSG *message, long *result);猫缭。
對于部分事件類型現(xiàn)解釋如下:

#define DBT_NO_DISK_SPACE 0x0047   
#define DBT_LOW_DISK_SPACE 0x0048
#define DBT_CONFIGMGPRIVATE 0x7FFF
#define DBT_DEVICEARRIVAL 0x8000    ///一個設(shè)備或者"piece of media" 已經(jīng)插入并且有效
#define DBT_DEVICEQUERYREMOVE 0x8001  ///移除設(shè)備需要請求權(quán)限藏杖,任何設(shè)備可以忽略并取消該請求
#define DBT_DEVICEQUERYREMOVEFAILED 0x8002  ///取消移除設(shè)備的請求
#define DBT_DEVICEREMOVEPENDING 0x8003  ///設(shè)備將會移除来吩,不能被忽略
#define DBT_DEVICEREMOVECOMPLETE 0x8004 ///設(shè)備移除
#define DBT_DEVICETYPESPECIFIC 0x8005
#define DBT_CUSTOMEVENT 0x8006  ///用戶事件發(fā)生
#define DBT_DEVTYP_OEM 0x00000000
#define DBT_DEVTYP_DEVNODE 0x00000001
#define DBT_DEVTYP_VOLUME 0x00000002 ///邏輯卷標(biāo)事件觸發(fā)
#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 ///設(shè)備插入或者移除系統(tǒng),設(shè)備節(jié)點變化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔽莱,一起剝皮案震驚了整個濱河市兽间,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌正塌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恤溶,死亡現(xiàn)場離奇詭異乓诽,居然都是意外死亡,警方通過查閱死者的電腦和手機咒程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門鸠天,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帐姻,你說我怎么就攤上這事稠集∧潭危” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵剥纷,是天一觀的道長痹籍。 經(jīng)常有香客問我,道長晦鞋,這世上最難降的妖魔是什么蹲缠? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮悠垛,結(jié)果婚禮上线定,老公的妹妹穿的比我還像新娘。我一直安慰自己确买,他們只是感情好斤讥,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著湾趾,像睡著了一般芭商。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撑帖,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天蓉坎,我揣著相機與錄音,去河邊找鬼胡嘿。 笑死蛉艾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷敌。 我是一名探鬼主播勿侯,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缴罗!你這毒婦竟也來了助琐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤面氓,失蹤者是張志新(化名)和其女友劉穎兵钮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舌界,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡掘譬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻拌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葱轩。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靴拱,到底是詐尸還是另有隱情垃喊,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布袜炕,位于F島的核電站本谜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妇蛀。R本人自食惡果不足惜耕突,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望评架。 院中可真熱鬧眷茁,春花似錦、人聲如沸纵诞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浙芙。三九已至登刺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗡呼,已是汗流浹背纸俭。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留南窗,地道東北人揍很。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像万伤,于是被迫代替她去往敵國和親窒悔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容