zoukankan      html  css  js  c++  java
  • 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);
    

      

  • 相关阅读:
    动图+源码,演示 Java 中常用数据结构执行过程及原理
    16 个超级实用的 Java 工具类
    图解 Java 垃圾回收机制,写得非常好!
    一些值得收藏的开源框架
    JVM 发生内存溢出的 8 种原因、及解决办法
    VC的function类说明 -- 继续
    引用文章 如何在lambda中引入递归调用
    VC中function函数解析
    folly无锁队列正确性说明
    C++ Programming Language中的Calculator源代码
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/10655371.html
Copyright © 2011-2022 走看看