Qt:監(jiān)控設(shè)備插入拔除

nativeEvent里面解析系統(tǒng)消息,獲取USB等設(shè)備的插入和拔出事件。

使用步驟:

  1. 窗口初始化時使用RegisterDeviceNotification注冊設(shè)備通知

  2. nativeEvent函數(shù)里面解析系統(tǒng)消息

  3. 窗口關(guān)閉時,使用UnregisterDeviceNotification關(guān)閉指定的設(shè)備通知句柄

關(guān)鍵代碼如下:

  • 注冊設(shè)備通知
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
    ZeroMemory(&notificationFilter, sizeof(notificationFilter));
    notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    notificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
    devNotify = RegisterDeviceNotification(reinterpret_cast<HANDLE>(this->winId()), &notificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);// DEVICE_NOTIFY_WINDOW_HANDLE); DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
    if (!devNotify) {
        qWarning() << "RegisterDeviceNotification failed";
    }
}
  • 解析系統(tǒng)消息
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) {
    MSG *msg = (MSG *) message;
    if (msg->message == WM_DEVICECHANGE) {
        auto hdr = reinterpret_cast<PDEV_BROADCAST_HDR>(msg->lParam);
        switch (msg->wParam) {
            case DBT_DEVICEARRIVAL:
                if (hdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
                    auto info = (PDEV_BROADCAST_DEVICEINTERFACE) hdr;
                    auto devName = QString::fromWCharArray(info->dbcc_name);
                    qDebug() << "+: " << devName;
                }
                break;
            case DBT_DEVICEREMOVECOMPLETE:
                if (hdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) {
                    auto info = (PDEV_BROADCAST_DEVICEINTERFACE) hdr;
                    auto devName = QString::fromWCharArray(info->dbcc_name);
                    qDebug() << "-: " << devName;
                }
                break;
        }
    }
    return false;
}

插拔串口時,輸出如下:

+:  "\\\\?\\USB#VID_1A86&PID_7523................................."
-:  "\\\\?\\USB#VID_1A86&PID_7523................................."
  • 關(guān)閉指定的設(shè)備通知句柄
MainWindow::~MainWindow() {
    if (devNotify) {
        UnregisterDeviceNotification(devNotify);
    }
}

版權(quán)聲明:本文為「txfly」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:http://m.itdecent.cn/p/9ec8a56c3f0f

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容