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

      

  • 相关阅读:
    redis和memcache的区别
    c语言行编辑程序
    C语言栈的实现
    双向链表
    静态链表的合并
    静态链表的创建
    链表
    将非递减有序排列(L L1)归并为一个新的线性表L2 线性表L2中的元素仍按值非递减
    C语言合并两个集合(L,L1) 将L1中不在L中的元素插入到L线性表中
    oracle--JOB任务
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/10655371.html
Copyright © 2011-2022 走看看