找回密码
 立即注册
收起左侧

监听U盘的插拔

4
回复
10339
查看
[复制链接]
累计签到:410 天
连续签到:1 天
来源: 2014-5-5 10:13:57 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一、linux环境下
http://blog.chinaunix.net/uid-25411469-id-1080799.html
没做测试。

二、windows环境下
我的测试环境win 7 sp1 旗舰版 已通过

原理:U盘插入时,windows会发消息
QT利用winEvent来处理windows的消息。
我代码中的部分源码

注释:测试的是U盘只有一个区,对于有的U盘插上去有多个区的,理论上下面的代码检测不到多个,未测试
/*
typedef struct tagMSG
{
    HWND hwnd;
    UINT   message;
    WPARAM wParam;
    LPARAM  lParam;
    DWORD  time;
    POINT pt;
}MSG;
*/
#include <Windows.h>
#include <Dbt.h>
char FirstDriveFromMask (ULONG unitmask)
{
    char i;
    for (i = 0; i < 26; ++i)
    {
        if (unitmask & 0x1)
            break;
        unitmask = unitmask >> 1;
    }
    return (i + 'A');
}
bool Widget::winEvent(MSG *message, long *)
{
    switch (message->message)
    {
    case WM_CREATE://初始化
        qDebug() << QString::fromLocal8Bit("初始化中!");
        break;
    case WM_DEVICECHANGE://系统硬件改变发出的系统消息
    {
        PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)message->lParam;
        switch (message->wParam)
        {
        case DBT_DEVICEARRIVAL://DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
            {
                PDEV_BROADCAST_VOLUME lpdbv =  (PDEV_BROADCAST_VOLUME)lpdb;
                switch(lpdbv->dbcv_flags)
                {
                case 0://U盘
                    qDebug() << QString::fromLocal8Bit("检测到U盘插入:") << FirstDriveFromMask(lpdbv->dbcv_unitmask);
                    break;
                case DBTF_MEDIA://光盘
                    qDebug() << QString::fromLocal8Bit("检测到光盘插入!");
                    break;
                }
            }
            break;
        case DBT_DEVICEREMOVECOMPLETE://DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
            {
                PDEV_BROADCAST_VOLUME lpdbv =  (PDEV_BROADCAST_VOLUME)lpdb;
                switch(lpdbv->dbcv_flags)
                {
                case 0:
                    qDebug() << QString::fromLocal8Bit("检测到U盘弹出!");
                    break;
                case DBTF_MEDIA:    //光盘
                    qDebug() << QString::fromLocal8Bit("检测到光盘弹出!");
                    break;
                }
            }
            break;
        }
    }
    }
    return false;
}
回复

使用道具 举报

累计签到:894 天
连续签到:1 天
2014-5-6 07:28:40 显示全部楼层
好东西啊,优盘小偷的核心部分也就是这些吧。
回复 支持 反对

使用道具 举报

累计签到:56 天
连续签到:1 天
2016-5-6 16:04:44 显示全部楼层
你好,我想请问一下,我用了你的代码能成功识别到u盘,但是当我的Widget处于hide()状态时,自定义的nativeEvent()  (ps:现在qt5已经用这个函数来代替你上面的那个函数),却不会自动执行,请问下该怎么解决这个问题?谢谢
回复 支持 反对

使用道具 举报

累计签到:56 天
连续签到:1 天
2016-5-6 19:17:09 显示全部楼层
你好,我想请问一下,我用了你的代码能成功识别到u盘,但是当我的Widget处于hide()状态时,自定义的nativeEvent()  (ps:现在qt5已经用这个函数来代替你上面的那个函数),却不会自动执行,请问下该怎么解决这个问题?谢谢
回复 支持 反对

使用道具 举报

累计签到:410 天
连续签到:1 天
2016-5-7 10:33:18 显示全部楼层
侠隐 发表于 2016-5-6 19:17
你好,我想请问一下,我用了你的代码能成功识别到u盘,但是当我的Widget处于hide()状态时,自定义的nativeE ...

这个倒没去测试,监听系统信号应该跟hide无关吧。
哪天有空了  试一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了