QT 检测hid设备拔插打印设备信息

概述

学习 qt 不久,记录顺便分享。

参考链接

1
2

步骤

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值