Qt动态检测U盘插拔

1 背景

最近为自己使用的资源管理实现U盘动态检测插拔功能,通过在网上查资料,发现在Windows下,当插拔磁盘时Windows会给应用发送广播消息WM_DEVICECHANGE通知各应用设备发生变化了,应用可以根据该消息来检测U盘动态插拔。下面讲述在Qt下如何检测WM_DEVICECHANGE消息,并检测U盘插拔。

2 Qt处理Windows消息

Windows消息是发送给窗口的,在Qt下窗口就是QWidget,QWidget有一个protected类型虚函数nativeEvent来处理平台本地消息,函数原型如下:

[virtual protected] bool QWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)

在Windows平台下各参数意义如下:

eventType : "windows_generic_MSG"
message:    MSG *
result:     LRESULT

可以重载该函数来处理WM_DEVICECHANGE消息。

3 实现

从QWidget派生一个类型Widget,如下所示:

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    bool nativeEvent(const QByteArray &eventType,
                     void *message,
                     long *result) override;
};

实现虚函数nativeEvent

bool Widget::nativeEvent(const QByteArray &eventType,
                 void *message,
                 long *result)
{
    Q_UNUSED(eventType)
    MSG* msg = (MSG*)message;
    if(msg->message == WM_DEVICECHANGE)
    {
        if(msg->wParam == DBT_DEVICEARRIVAL)
        {
            PDEV_BROADCAST_HDR devHdr = (PDEV_BROADCAST_HDR)msg->lParam;
            if(devHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                //U盘插入, 更新驱动器列表
            }
            *result = 0;
        }
        else if(msg->wParam == DBT_DEVICEREMOVECOMPLETE)
        {
            PDEV_BROADCAST_HDR devHdr = (PDEV_BROADCAST_HDR)msg->lParam;
            if(devHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                //U盘拔出, 更新驱动器列表
            }
            *result = 0;
        }
    }
    return false;//返回false表明该消息接着向下传递,以便其它应用处理该消息。
}

如上所示将参数message转换为MSG*类型msg,通过检测msg的成员message,wParam和lParam类型来判断U盘插拔。

  • msg成员message是否是WM_DEVICECHANGE类型, 如果是则检测msg的wParam参数。
  • 如果wParam是DBT_DEVICEARRIVAL表明设备插入,是DBT_DEVICEREMOVECOMPLETE表明设备拔出。
  • 如何检测设备是U盘而不是鼠标/键盘以及其它设备呢?这就需要通过msg参数lParam判断了。如果lParam类型为DBT_DEVTYP_VOLUME就表明设备是U盘。

4 运行效果

在这里插入图片描述

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flysnow010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值