|
一、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;
}
|
|