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);
    

      

  • 相关阅读:
    eclipse添加xsd
    Ibatis 后台打印完整的sql语句
    eclipse 将文件夹作为sourcefolder
    git:hook declined FATAL: W refs/heads DENIED by fallthru error
    单点登陆CAS安装过程中可能遇到的问题
    单点登录的原理与CAS技术的研究
    【转载】软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    UML工具选择
    UML 用例图,时序图,活动图的定义以及区别
    基于UML的需求分析和系统设计个人体会
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/10655371.html
Copyright © 2011-2022 走看看