您当前的位置: 首页 >  windows

鱼儿-1226

暂无认证

  • 1浏览

    0关注

    1100博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt: usb热插拔检测(windows)

鱼儿-1226 发布时间:2021-06-15 15:12:12 ,浏览量:1

Qt提供了QAbstractNativeEventFilter来实现本地时间得过滤,通过对本地事件的检测,判断usb热插拔;(这里是windows 的例子);

首先,以QWidget, QAbstractNativeEventFilter为基类建立子类,重定义nativeEventFilter:

1

virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);

譬如:建立UDisk类,  class UDisk : public QWidget, public QAbstractNativeEventFilter{}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

bool UDisk::nativeEventFilter(const QByteArray &eventType, void *message, long *result)

{

    MSG* msg = reinterpret_cast(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进行注册才能生效:

1

2

UDisk *pDisk = new UDisk;

qApp->installNativeEventFilter(pDisk);

关注
打赏
1604459285
查看更多评论
立即登录/注册

微信扫码登录

0.0405s