QT5 检测 usb设备插拔
2015-12-09 20:07
423 查看
上来直接贴代码
完整工程文件下载
QT5 USB 插拔检测完整工程
mainwindow.h
mainwindow.cpp
最后留下一些说明
qt 检测usb插拔基本上是和vc,mfc的做法是一致的,上面的代码段我也是直接从VC工程中拷贝出来的
在QT里的做法
1.头文件
2.重写QMainWindow的方法
这里qt4和qt5可能不一样,我这是QT5的写法
在里面处理usb插拔事件
到这一步可以识别U盘,和部分USB设备了,但是还是不能识别usb-key
3 RegisterDeviceNotification
注释掉了几个,要是你的设备还是不能识别,把注释掉的几个打开看看
完整工程文件下载
QT5 USB 插拔检测完整工程
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <windows.h> #include <QMainWindow> #include <dbt.h> #include<devguid.h> #include<SetupAPI.h> #include<InitGuid.h> #include <QString> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; char FirstDriveFromMask (ULONG unitmask); protected: bool nativeEvent(const QByteArray & eventType, void * message, long*result); private slots: void on_pushButton_clicked(); }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <locale> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); #if 1 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();//m_usb->GetDriverGUID(); hDevNotify = RegisterDeviceNotification((HANDLE)this->winId(),&NotifacationFiler,DEVICE_NOTIFY_WINDOW_HANDLE); if(!hDevNotify) { int Err = GetLastError(); qDebug() << "注册失败" <<endl; } //else } #endif } MainWindow::~MainWindow() { delete ui; } char MainWindow::FirstDriveFromMask(ULONG unitmask) { char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return (i + 'A'); } bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { MSG* msg = reinterpret_cast<MSG*>(message); int msgType = msg->message; if(msgType==WM_DEVICECHANGE) { //qDebug() << "Event DEVICECHANGE Happend" << endl; PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam; switch (msg->wParam) { case DBT_DEVICEARRIVAL: if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if(lpdbv->dbcv_flags ==0) { //插入u盘 QString USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask)); qDebug() << "USB_Arrived and The USBDisk is: "<<USBDisk ; ui->textBrowser->append("USB_Arrived and The USBDisk is " + USBDisk); } } if(lpdb->dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb; QString strname = QString::fromWCharArray(pDevInf->dbcc_name,pDevInf->dbcc_size); // ui->textBrowser->append("插入设备 :" + strname); } break; case DBT_DEVICEREMOVECOMPLETE: qDebug() << "设备移除" <<endl; if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if(lpdbv->dbcv_flags == 0) { //qDebug() << "USB_Removed"; ui->textBrowser->append("USB_Remove"); } } if(lpdb->dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb; qDebug()<< "移除设备(name):" << pDevInf->dbcc_name; //qDebug()<< "移除设备(guid):" << pDevInf->dbcc_classguid; qDebug()<< "移除设备(size):" << pDevInf->dbcc_size; QString strname = QString::fromWCharArray(pDevInf->dbcc_name,pDevInf->dbcc_size); ui->textBrowser->append("移除设备 " + strname); } break; } } return false; } void MainWindow::on_pushButton_clicked() { ui->textBrowser->clear(); }
最后留下一些说明
qt 检测usb插拔基本上是和vc,mfc的做法是一致的,上面的代码段我也是直接从VC工程中拷贝出来的
在QT里的做法
1.头文件
#include <windows.h> #include <dbt.h> #include<devguid.h> #include<SetupAPI.h> #include<InitGuid.h>
2.重写QMainWindow的方法
bool nativeEvent(const QByteArray & eventType, void * message, long*result);
这里qt4和qt5可能不一样,我这是QT5的写法
在里面处理usb插拔事件
到这一步可以识别U盘,和部分USB设备了,但是还是不能识别usb-key
3 RegisterDeviceNotification
注释掉了几个,要是你的设备还是不能识别,把注释掉的几个打开看看
相关文章推荐
- BootISO:从 ISO 文件中创建一个可启动的 USB 设备
- android USB如何修改VID具体实现
- 用vbs确定计算机是否有 USB 2.0 端口的代码
- Android中查看USB连接的外接设备信息的代码实例
- C#获取USB事件API实例分析
- 用u盘安装操作系统
- Ubuntu上安装Qt5
- 从usb启动安装linux
- 利用4G U盘安装Fedora Linux
- 用组策略彻低禁止USB存储设备、光驱、软驱、ZIP软驱
- usb禁用原理
- USB有关的编程
- usb
- USB硬件***危险性初步分析
- 关于禁用USB存储设备,而不禁使用USB键盘,鼠标
- 用USB安装esxi
- 量产化工具
- 用DriverStudio制作简单USB驱动程序
- USB设备驱动程序开发框架
- 如何在XenDesktop中映射USB设备