最近学习usb的方面东西,怎么在win32下用回调函数实时监测u盘插入拔出?
最近学习usb的方面东西,怎么在win32下用回调函数实时监测u盘插入拔出?
[解决办法]
收到WM_DEVICECHANGE消息
说明电脑又设备状态更新
然后进一步去判断是不是U盘
判断是否是U盘的方法
(1)#include <Dbt.h>
(2)
bool isUDisk(LPARAM lParam,CString &path){//返回为真表示是U盘,同时path为盘符
bool yes=false;
path="";
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags==0)//判断是U盘
{
DWORD dwData=lpdbv->dbcv_unitmask;
// for loop 得到盘符
for(char i=0;i<26;++i)
{
if(dwData&0x1)
{
char a=char(i+'A');
CString str;
str.Format(TEXT("%c"),a);
//CString str=TCHAR(i+'A');
path=str+_T(":");
yes=true;
break;
}
dwData=dwData>>1;
if(dwData==0x0000)
break;
}
}
}
return yes;
}
[解决办法]
只能用消息响应.
不过你可以在消息响应中回调一个你自己定义的函数.
(其实消息响应,本质上不就是回调函数么?? )
有一个问题要注意一下, WM_DEVICECHANGE 消息只会发送到有窗体的窗口,
如果你要实现在 后台(无界面) 或在控制台 下捕获这个消息,必须要建立一个线程,并创建一个 width=0,height=0 的窗口,并且设置监控该消息.
而且,在线程中的窗口得到的消息,和在MFC下得到的消息是不同的(一定要注意这个问题).
MFC下一次u盘动作,只会出现一条消息,而且消息里面就带有u盘盘符.
但在后台检测中得到的消息, 一次u盘动作(插入或拔出),xp下会产生4条消息,win7下会产生3条消息(不会产生xp下的第3条消息),而且这几条消息与MFC下得到的都是不同的.(且都是不带盘符的).
(第1条消息是usb设备插入时产生,附带信息为u盘sn,
第2条消息为系统识别到usb设备后产生,附带信息为u盘类型(如usbdisk, usbcdrom,usb鼠标键盘等)
第3条消息和第4条消息只有1个字节不同,具体什么作用不清楚.
但可以确定,在系统为u盘分配盘符之后,才会产生第4条消息.
如果你在产生第二条消息的之后就把u盘给禁用了,那么系统就不会分配u盘盘符,当然,也不会发出第4条消息.
)