Qt: usb熱插拔檢測(windows);


Qt提供了QAbstractNativeEventFilter來實現本地時間得過濾,通過對本地事件的檢測,判斷usb熱插拔;(這里是windows 的例子);

首先,以QWidget, QAbstractNativeEventFilter為基類建立子類,重定義nativeEventFilter:

virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);

譬如:建立UDisk類,  class UDisk : public QWidget, public QAbstractNativeEventFilter{}

bool UDisk::nativeEventFilter(const QByteArray &eventType, void *message, long *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:
            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
                if(lpdbv->dbcv_flags ==0) {
                    QString USBDisk = QString(this->deviceMask(lpdbv ->dbcv_unitmask)) + ":/";
                    emit sigUDiskCome(USBDisk);
                }
            }
            break;
        case DBT_DEVICEREMOVECOMPLETE:
            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
                if(lpdbv->dbcv_flags == 0) {
                    QString USBDisk = QString(this->deviceMask(lpdbv ->dbcv_unitmask)) +":/";
                    emit sigUDiskRemove(USBDisk);
                }
            }
            break;
        case DBT_DEVNODES_CHANGED:
            break;
        default:
            break;
        }
    }
    return QWidget::nativeEvent(eventType, message, result);
}

在主程序中,還需要對該nativeEventFilter進行注冊才能生效:

UDisk *pDisk = new UDisk;
qApp->installNativeEventFilter(pDisk);

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM