美文网首页
Qt:监控设备插入拔除

Qt:监控设备插入拔除

作者: txfly | 来源:发表于2022-10-10 14:22 被阅读0次

nativeEvent里面解析系统消息,获取USB等设备的插入和拔出事件。

使用步骤:

  1. 窗口初始化时使用RegisterDeviceNotification注册设备通知

  2. nativeEvent函数里面解析系统消息

  3. 窗口关闭时,使用UnregisterDeviceNotification关闭指定的设备通知句柄

关键代码如下:

  • 注册设备通知
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";
    }
}
  • 解析系统消息
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................................."
  • 关闭指定的设备通知句柄
MainWindow::~MainWindow() {
    if (devNotify) {
        UnregisterDeviceNotification(devNotify);
    }
}

版权声明:本文为「txfly」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.jianshu.com/p/9ec8a56c3f0f

相关文章

  • Qt:监控设备插入拔除

    在nativeEvent里面解析系统消息,获取USB等设备的插入和拔出事件。 使用步骤: 窗口初始化时使用Regi...

  • Qt 的插入的图片的移动、缩放操作

    Qt贴吧里的资料汇总 QPainter Qt 插入图片这个操作有许多的方式,常用的是采用QPainter绘图板插入...

  • QT - 配置嵌入式Linux设备

    QT - 配置嵌入式Linux设备 为给定设备构建Qt需要工具链和sysroot。此外,某些设备需要供应商特定的适...

  • adb wifi链接设备

    adb 链接wifi设备 首先链接设备 开启设备端口监听 开启监听后 可以拔除usb adb 链接设备adb c...

  • qt中插入matplotlib动画不显示

    有一次在Qt5中需要插入matplotlib中的画图。此时需导入 FigureCanvas可作为QT控件加入UI中...

  • 2020-06-30

    通讯无线安全监控功能 实时监控当前无线空域的全部无线设备和无线通信行为。 1)监控无线设备实时信息(数量、类型、频...

  • QT QTextEdit 插入文本

  • 使用 CMake 将 Qt 项目部署到嵌入式设备

    运行 Qt 项目时,Qt Creator 首先通过 ssh 将项目部署到远程嵌入式 Linux 设备上,然后在远程...

  • Android的多个外置SDCard插拔监控

    最近工作需求,需要对SDCard的插拔做监控,由于设备可能有多个挂点,可插入多个SD卡,要判断具体哪一个SD卡被插...

  • 监控系统简介

    监控系统作用 在一个成熟的系统中,监控系统,应准确无误的监控每一台主机,如果有网络设备,还应监控网络设备。在未接入...

网友评论

      本文标题:Qt:监控设备插入拔除

      本文链接:https://www.haomeiwen.com/subject/ahsoartx.html