QT5.5下的USB HID热插拔检测,未全部完成,聊作记录。

来源:互联网 发布:山东省网络快报 编辑:程序博客网 时间:2024/06/06 04:11

QT5.5下的USB HID热插拔检测,未全部完成,聊作记录。

#if _MSC_VER >= 1600#pragma execution_character_set("utf-8")#endif#include "qrfreceiver.h"#include <QRegularExpression>#include <QDebug>#undef _WIN32_WINNT#define _WIN32_WINNT 0x0500#include <dbt.h>#include <setupapi.h>#pragma comment( lib, "setupapi.lib" )extern "C" {#include <hidsdi.h>}#pragma comment( lib, "hid.lib" )QRfReceiver::QRfReceiver(QWidget *parent) : QWidget(parent){    RegisterHidDeviceNotify();    vendor_id=0x6371;    product_id=0x7601;}QRfReceiver::~QRfReceiver(){    if(m_hDevNotify)UnregisterDeviceNotification(m_hDevNotify);}bool QRfReceiver::nativeEvent(const QByteArray &eventType, void *message, long *result){    MSG* msg= reinterpret_cast<MSG*>(message);    int msgType = msg->message;    if(msgType == WM_DEVICECHANGE)    {        qDebug() << "收到事件 " <<msg->wParam<<msg->lParam ;        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR )msg->lParam;        switch(msg->wParam)        {        case DBT_DEVICEARRIVAL:    //设备插入        {            if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {               isRightVidAndPid(lpdb);            }        }            break;        case DBT_DEVICEREMOVECOMPLETE:  //设备拔出        {            if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {                PDEV_BROADCAST_DEVICEINTERFACE pDevInf =(PDEV_BROADCAST_DEVICEINTERFACE)lpdb;                QString pname=QString::fromWCharArray(pDevInf->dbcc_name+4);                qDebug() << "设备拔出"<<pname;                QRegularExpression re("HID#VID_(?<vid>\\w{4})&PID_(?<pid>\\w{4})");                QRegularExpressionMatch match = re.match(pname);                if (match.hasMatch()) {                    qDebug() <<match.capturedTexts();                }            }            break;        }        }}    return false;}bool QRfReceiver::RegisterHidDeviceNotify(){    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;    GUID HidGuid;    HidD_GetHidGuid(&HidGuid);    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter));    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;    NotificationFilter.dbcc_classguid = HidGuid;      m_hDevNotify = RegisterDeviceNotification((HANDLE)this->winId(),                                                        &NotificationFilter,                                                        DEVICE_NOTIFY_WINDOW_HANDLE);    if(!m_hDevNotify)        return false;    return true;}bool QRfReceiver::isRightVidAndPid(void *p){    PDEV_BROADCAST_DEVICEINTERFACE pDevInf =(PDEV_BROADCAST_DEVICEINTERFACE)p;    QString pname=QString::fromWCharArray(pDevInf->dbcc_name+4);    qDebug() << "设备插入"<<pname;    QRegularExpression re("HID#VID_(?<vid>\\w{4})&PID_(?<pid>\\w{4})");    QRegularExpressionMatch match = re.match(pname);    if (match.hasMatch()) {        qDebug() << match.capturedTexts();    }    return true;}
1 0
原创粉丝点击