#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QTimer>
#include <QPalette>
#include <QDateTime>
#pragma comment(lib, "User32.lib")
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowTitle(QStringLiteral("test"));
setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint);
setFixedSize(350, 210);
// 此函数用于注册设备 否则无法识别到usb设备的具体数据
registerDevice();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::registerDevice()
{
const GUID GUID_DEVINTERFACE_LIST[] = {
{ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }, //USB设备的GUID
{ 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } }};
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];
hDevNotify = RegisterDeviceNotification((HANDLE)this->winId(), &NotifacationFiler, DEVICE_NOTIFY_WINDOW_HANDLE);
if (!hDevNotify) {
qCritical() << QStringLiteral("注册失败!");
}
}
}
bool Dialog::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 (WM_DEVICECHANGE == msgType) {
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch (msg->wParam) {
case DBT_DEVICEARRIVAL:
{
qDebug() << QStringLiteral("设备插入");
if (DBT_DEVTYP_VOLUME == lpdb->dbch_devicetype) {
qDebug() << "DBT_DEVTYP_VOLUME" << DBT_DEVTYP_VOLUME;
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (0 == lpdbv->dbcv_flags) { //优盘
QString USBDisk = QString(this->firstDriveFromMask(lpdbv ->dbcv_unitmask));
ui->labelShowMsg->setText(QString(QStringLiteral("已检测到USB设备插入--盘符:<%1>")).arg(USBDisk));
} else if (DBTF_MEDIA == lpdbv->dbcv_flags) {
qDebug() << "CD_Arrived.";
}
} else if (DBT_DEVTYP_DEVICEINTERFACE == lpdb->dbch_devicetype) {
qDebug() << "DBT_DEVTYP_DEVICEINTERFACE" << DBT_DEVTYP_DEVICEINTERFACE;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
QString name = QString::fromWCharArray(pDevInf->dbcc_name);
qDebug() << name;
if (!name.isEmpty()) {
if (name.contains("USBSTOR")) {
QStringList listAll = name.split('#');
QStringList listInfo = listAll.at(1).split('&');
m_usbInfoList.append(listInfo.at(1).mid(4)); //设备制造商 3
m_usbInfoList.append(listInfo.at(2).mid(5)); //设备型号 4
m_usbInfoList.append(listInfo.at(3).mid(4)); //设备版本 5
} else {
m_usbInfoList.clear();
QStringList listAll = name.split('#');
QStringList listID = listAll.at(1).split('&');
qDebug() << "listID.at(0).right(4):" << listID.at(0).right(4);
m_usbInfoList.append(listID.at(0).right(4)); //vid 0
m_usbInfoList.append(listID.at(1).right(4)); //pid 1
m_usbInfoList.append(listAll.at(2)); //设备序列号 2
}
}
display();
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
{
qDebug() << QStringLiteral("设备拔出");
if (DBT_DEVTYP_VOLUME == lpdb->dbch_devicetype) {
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (0 == lpdbv->dbcv_flags) {
ui->labelShowMsg->setText(QString(QStringLiteral("USB设备已拔出!")));
QTimer::singleShot(1000, ui->labelShowMsg, SLOT(clear()));
}
if (DBTF_MEDIA == lpdbv->dbcv_flags) {
ui->labelShowMsg->setText("CD_Removed.");
}
}
}
break;
}
}
return false;
}
void Dialog::display()
{
if (m_usbInfoList.count() >= 6) {
ui->lineEditVid->setText(m_usbInfoList.at(0));
ui->lineEditPid->setText(m_usbInfoList.at(1));
ui->lineEditSerialNum->setText(m_usbInfoList.at(2));
ui->lineEditProduct->setText(m_usbInfoList.at(3));
ui->lineEditVendorID->setText(m_usbInfoList.at(4));
ui->lineEditProductVersion->setText(m_usbInfoList.at(5));
} else {
ui->lineEditVid->setText(m_usbInfoList.at(0));
ui->lineEditPid->setText(m_usbInfoList.at(1));
ui->lineEditSerialNum->setText(m_usbInfoList.at(2));
}
}
char Dialog::firstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i) {
if (unitmask & 0x1) {
break;
}
unitmask = unitmask >> 1;
}
return (i + 'A');
}
评论0