概述
学习 qt 不久,记录顺便分享。
参考链接
步骤
1、新建一个空的工程,继承于Qwidget;我选的编译器是mingw32,64也可以。工程名mywidget;
2、mywidget.c 代码如下:
#include "mywidget.h"
#include "ui_mywidget.h"
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget)
{
ui->setupUi(this);
static HDEVNOTIFY hDevNotify;
//给设备注册通知
DEV_BROADCAST_DEVICEINTERFACE Notificationfilter;
ZeroMemory(&Notificationfilter,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
Notificationfilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
Notificationfilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
//Notificationfilter.dbcc_classguid ={0x745a17a0,0x74d3,0x11d0,{0xb6,0xfe,0x00,0xa0,0xc9,0x0f,0x57,0xda}};
Notificationfilter.dbcc_classguid = {0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 }};
hDevNotify = RegisterDeviceNotificationW((HANDLE)this->winId(),&Notificationfilter,DEVICE_NOTIFY_WINDOW_HANDLE);
if(!hDevNotify)
{
qDebug() << "注册失败" << endl;
}
else
{
qDebug() << "注册成功" << endl;
}
}
myWidget::~myWidget()
{
delete ui;
}
bool myWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
Q_UNUSED(eventType);
Q_UNUSED(result);
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if(msgType == WM_DEVICECHANGE)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch(msg->wParam)
{
case DBT_DEVICEARRIVAL: //有设备插入且可以使用
qDebug() << "DBT_DEVICEARRIVAL";
if(lpdb != nullptr && lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
qDebug() << "DBT_DEVTYP_DEVICEINTERFACE";
qDebug() << "Device is connecting!";
PDEV_BROADCAST_DEVICEINTERFACE pDevInf =(PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
QString strHidName=QString::fromWCharArray(pDevInf->dbcc_name);
qDebug(qPrintable(strHidName));
wchar_t* c = pDevInf->dbcc_name;
QString loginStr = QString::fromWCharArray(c).toUpper();
QString sign = loginStr.split("#")[1];
QString VID = sign.split("&")[0];
QString PID = sign.split("&")[1];
qDebug() << loginStr;qDebug() << sign;qDebug() << VID;qDebug() << PID;
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(lpdb != nullptr && lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf =(PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
QString strHidName=QString::fromWCharArray(pDevInf->dbcc_name);
qDebug(qPrintable(strHidName));
wchar_t* c = pDevInf->dbcc_name;
QString loginStr = QString::fromWCharArray(c).toUpper();
QString sign = loginStr.split("#")[1];
QString VID = sign.split("&")[0];
QString PID = sign.split("&")[1];
qDebug() << loginStr;qDebug() << sign;qDebug() << VID;qDebug() << PID;
}
qDebug() << "DBT_DEVICEREMOVECOMPLETE";
break;
}
}
}
3、mywidget.h 代码如下:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include "windows.h"
#include "winuser.h"
#include <dbt.h>
#include <QApplication>
#include <QDebug>
#include <devguid.h>
namespace Ui {
class myWidget;
}
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = nullptr);
~myWidget();
private:
Ui::myWidget *ui;
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
};
#endif // MYWIDGET_H
4、其他任何文件都不需要改,编译运行会打印注册成功。之后插入拔出设备提示如下。
工程下载
删除.pro.user文件再打开。
链接:https://pan.baidu.com/s/1MtmuRD-HB3j0fflT_pU_NA
提取码:l2h4