首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

最近学习usb的方面东西,如何在win32上用回调函数实时监测u盘插入拔出

2012-08-16 
最近学习usb的方面东西,怎么在win32下用回调函数实时监测u盘插入拔出?最近学习usb的方面东西,怎么在win32

最近学习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条消息.
)

热点排行