一个关于USB的问题,高手请进 插入移动硬盘后,如何自动启动一程序对USB盘内容进行检测。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 嗯,再贴一次,赚点分:监测u盘插入,则根据WM_DEVICECHANGE消息。LRESULT CTestUSBDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {if(message == WM_DEVICECHANGE) //0x8000,0x8004{CString str;DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;switch(wParam){case DBT_CONFIGCHANGECANCELED:TRACE("DBT_CONFIGCHANGECANCELED");break;case DBT_CONFIGCHANGED:TRACE("DBT_CONFIGCHANGED");break;case DBT_DEVICEQUERYREMOVE:TRACE("DBT_DEVICEQUERYREMOVE");break;case DBT_DEVICEQUERYREMOVEFAILED:TRACE("DBT_DEVICEQUERYREMOVEFAILED");break;case DBT_DEVICEREMOVEPENDING:TRACE("DBT_DEVICEREMOVEPENDING");break;case DBT_DEVICETYPESPECIFIC:TRACE("DBT_DEVICETYPESPECIFIC");break;case DBT_QUERYCHANGECONFIG:TRACE("DBT_QUERYCHANGECONFIG");break;case DBT_USERDEFINED:TRACE("DBT_USERDEFINED");break;case DBT_DEVICEARRIVAL:if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME){PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;if(lpdbv->dbcv_flags & DBTF_MEDIA){str.Format("Drive %c 插入", FirstDriveFromMask(lpdbv ->dbcv_unitmask));//AfxMessageBox(str);}else{char ch = FirstDriveFromMask(lpdbv ->dbcv_unitmask);str.Format("%c:\\",ch);}}break;case DBT_DEVICEREMOVECOMPLETE:if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME){PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;if(lpdbv->dbcv_flags & DBTF_MEDIA){str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));}else{str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));}//AfxMessageBox(str);}break;default:break;}}return CDialog::WindowProc(message, wParam, lParam);} 哥们,非常感谢,帮人帮到底,FirstDriveFromMask?函数请一并给出 saliors大哥,看到你的贴子深受启发,人民感谢你。请问为何我照着你的方法去做时,却不进入if(message == WM_DEVICECHANGE),是什么原因呀?急,偶是新手,渴望再次得到你的启发,谢谢,领导在催中…… WM_DEVICECHANGE这个表示发现USB等设备,你的SDK是否更新等 谢谢各位,我用ON_MESSAGE(WM_DEVICECHANGE, OnDeviveChange)的方式就可以检测到设备信息了 各位大虾 通过WM_DEVICECHANGE 可以检测到usb接口设备 那属于disk类的usb设备该如何检测呢 disk 类的设备一般采用的是mtp协议 我分别用了两种方法来检测设备 1 . WM_DEVICECHANGE 如 (saliors(正在学习中) 兄:)的方法 检测出了基本信息 但是disk 类设备检测不到 2.我采用的是通过硬件设备的guid来枚举检测硬件设备 通过设备路径来获取各种信息 这种方法也是检测不到。 请各位大虾看看是什么问题。谢谢!!!! 如何知道USB是连接还是断开?????????? LRESULT CMP3DownloadDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class DWORD ThreadId; bool allzero=true; int i; if(message==WM_DEVICECHANGE) { if(wParam==DBT_DEVICEARRIVAL)//有新设备插入系统 { DEV_BROADCAST_HDR* pDev=(DEV_BROADCAST_HDR*)lParam; if(pDev->dbch_devicetype==DBT_DEVTYP_VOLUME )//移动存储设备 { DEV_BROADCAST_VOLUME* pDisk=(DEV_BROADCAST_VOLUME*)lParam; DWORD mask=pDisk->dbcv_unitmask; char dir[MAX_PATH]; for(i=0;i<32;i++) { if((mask>>i)==1) { dir[0]='A'+i; dir[1]='\0'; strcat(dir,":\\"); break; } } if(i==32) { AfxMessageBox("无效的分区名!"); return CDialog::WindowProc(message, wParam, lParam); } else { //dir就是U盘对应的分区 } } } } return CDialog::WindowProc(message, wParam, lParam);} 用CMake编译时出错 怎么实现注册 登陆 关于窗口拆分的一个问题(感恩送分题) 如何在串口发送空字符? 请大家帮助我解决这样一个windows服务的问题? 急!在线等待,在2000中编译的可实行文件在95下不能运行!! VC中如何输出HTML格式的文件~~ 请问vc的跟踪调试中的一个问题(初学者) 请教个BMP转换成AVI的问题 急!请问各位前辈,如何获得单文档中某一个View类的指针? 很奇怪的一个问题,关于剪切板的. 请教如何用sendmessage函数在两个无模式对话框中传递数据。
监测u盘插入,则根据WM_DEVICECHANGE消息。
LRESULT CTestUSBDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_DEVICECHANGE) //0x8000,0x8004
{
CString str;
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;
switch(wParam)
{
case DBT_CONFIGCHANGECANCELED:
TRACE("DBT_CONFIGCHANGECANCELED");
break;
case DBT_CONFIGCHANGED:
TRACE("DBT_CONFIGCHANGED");
break;
case DBT_DEVICEQUERYREMOVE:
TRACE("DBT_DEVICEQUERYREMOVE");
break;
case DBT_DEVICEQUERYREMOVEFAILED:
TRACE("DBT_DEVICEQUERYREMOVEFAILED");
break;
case DBT_DEVICEREMOVEPENDING:
TRACE("DBT_DEVICEREMOVEPENDING");
break;
case DBT_DEVICETYPESPECIFIC:
TRACE("DBT_DEVICETYPESPECIFIC");
break;
case DBT_QUERYCHANGECONFIG:
TRACE("DBT_QUERYCHANGECONFIG");
break;
case DBT_USERDEFINED:
TRACE("DBT_USERDEFINED");
break;
case DBT_DEVICEARRIVAL:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 插入", FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//AfxMessageBox(str);
}
else
{
char ch = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
str.Format("%c:\\",ch);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
else
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
//AfxMessageBox(str);
}
break;
default:
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
如何检测呢 disk 类的设备一般采用的是mtp协议 我分别用了两种方法来检测设备
1 . WM_DEVICECHANGE 如 (saliors(正在学习中) 兄:)的方法 检测出了基本信息
但是disk 类设备检测不到
2.我采用的是通过硬件设备的guid来枚举检测硬件设备 通过设备路径来获取各种信息
这种方法也是检测不到。
请各位大虾看看是什么问题。谢谢!!!!
{
// TODO: Add your specialized code here and/or call the base class
DWORD ThreadId;
bool allzero=true;
int i; if(message==WM_DEVICECHANGE)
{
if(wParam==DBT_DEVICEARRIVAL)//有新设备插入系统
{
DEV_BROADCAST_HDR* pDev=(DEV_BROADCAST_HDR*)lParam;
if(pDev->dbch_devicetype==DBT_DEVTYP_VOLUME )//移动存储设备
{
DEV_BROADCAST_VOLUME* pDisk=(DEV_BROADCAST_VOLUME*)lParam;
DWORD mask=pDisk->dbcv_unitmask;
char dir[MAX_PATH];
for(i=0;i<32;i++)
{
if((mask>>i)==1)
{
dir[0]='A'+i;
dir[1]='\0';
strcat(dir,":\\");
break;
}
} if(i==32)
{
AfxMessageBox("无效的分区名!");
return CDialog::WindowProc(message, wParam, lParam);
}
else
{
//dir就是U盘对应的分区
}
}
}
} return CDialog::WindowProc(message, wParam, lParam);
}