关于u盘识别(OnDeviceChange方式)的几个小问题,请问
关于u盘识别(OnDeviceChange方式)的几个问题,请教!
烦请高手帮忙,这个问题把我弄得好憔悴,我的代码骨架如下:
[code=C/C++][/code]
LRESULT CHWDetectDlg::OnMyDeviceChange(UINT nEventType,DWORD dwData)
{
PDEV_BROADCAST_HDR dbd = (PDEV_BROADCAST_HDR) dwData;
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
...
break;
case DBT_DEVICEARRIVAL: //问题点在这个分支下
switch( dbd ->dbch_devicetype )
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)dbd ;
//这种情况下如何读出盘符???
break;
case DBT_DEVTYP_VOLUME:
PDEV_BROADCAST_VOLUME pDevInf = (PDEV_BROADCAST_VOLUME)dbd ;
break;
default:
break;
}
...
break;
default:
break;
}
return TRUE;
}
问题一、在响应u盘的插入消息后(DBT_DEVICEARRIVAL),在判断dbd ->dbch_devicetype 时,网上找的代码都直接走到“case DBT_DEVTYP_VOLUME:“这个分支,而我自己的代码却走向却是”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况。为什么同样的事件,触发的逻辑走向不一样呢?
问题二、在”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况下,我想得到插入u盘的盘符,我该怎样实现呢??
问题三、在设备注册过程中,代码如下:
DEV_BROADCAST_DEVICEINTERFACE DevInt;
memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInt.dbcc_classguid = GetCurrentUSBGUID();//m_usb->GetDriverGUID();
if (!RegisterDeviceNotification(m_hWnd, &DevInt,DEVICE_NOTIFY_WINDOW_HANDLE) )
return FALSE;
红色字体行,“dbcc_devicetype ”可改成其他值吗,比如PDEV_BROADCAST_VOLUME,还是固定值???
感谢!
------解决方案--------------------
怎么不重载WindowProc?
烦请高手帮忙,这个问题把我弄得好憔悴,我的代码骨架如下:
[code=C/C++][/code]
LRESULT CHWDetectDlg::OnMyDeviceChange(UINT nEventType,DWORD dwData)
{
PDEV_BROADCAST_HDR dbd = (PDEV_BROADCAST_HDR) dwData;
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
...
break;
case DBT_DEVICEARRIVAL: //问题点在这个分支下
switch( dbd ->dbch_devicetype )
{
case DBT_DEVTYP_DEVICEINTERFACE:
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)dbd ;
//这种情况下如何读出盘符???
break;
case DBT_DEVTYP_VOLUME:
PDEV_BROADCAST_VOLUME pDevInf = (PDEV_BROADCAST_VOLUME)dbd ;
break;
default:
break;
}
...
break;
default:
break;
}
return TRUE;
}
问题一、在响应u盘的插入消息后(DBT_DEVICEARRIVAL),在判断dbd ->dbch_devicetype 时,网上找的代码都直接走到“case DBT_DEVTYP_VOLUME:“这个分支,而我自己的代码却走向却是”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况。为什么同样的事件,触发的逻辑走向不一样呢?
问题二、在”case DBT_DEVTYP_DEVICEINTERFACE:”这种情况下,我想得到插入u盘的盘符,我该怎样实现呢??
问题三、在设备注册过程中,代码如下:
DEV_BROADCAST_DEVICEINTERFACE DevInt;
memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInt.dbcc_classguid = GetCurrentUSBGUID();//m_usb->GetDriverGUID();
if (!RegisterDeviceNotification(m_hWnd, &DevInt,DEVICE_NOTIFY_WINDOW_HANDLE) )
return FALSE;
红色字体行,“dbcc_devicetype ”可改成其他值吗,比如PDEV_BROADCAST_VOLUME,还是固定值???
感谢!
------解决方案--------------------
怎么不重载WindowProc?
- C/C++ code
LRESULT CXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class DWORD ThreadId; bool allzero=true; size_t i; if(message!=WM_DEVICECHANGE) { return CDialog::WindowProc(message, wParam, lParam); } if(wParam==DBT_DEVICEARRIVAL)//有新设备插入系统 { DEV_BROADCAST_HDR* pDev=(DEV_BROADCAST_HDR*)lParam; if(pDev->dbch_devicetype!=DBT_DEVTYP_VOLUME )//移动存储设备 { return CDialog::WindowProc(message, wParam, Param); } DEV_BROADCAST_VOLUME* pDisk=(DEV_BROADCAST_VOLUME*)lParam; DWORD mask=pDisk->dbcv_unitmask; TCHAR diskname[MAX_PATH]; for(i=0;i<32;i++) { if((mask>>i)==1) {//获取盘符 diskname[0]='A'+i; diskname[1]='\0'; _tcscat_s(diskname,TEXT(":\\")); break; } } } }
------解决方案--------------------
读出盘符 我记得好像有API的,记得不太清楚。
------解决方案--------------------
9楼,你在6楼都引用了
Volume notifications are also broadcast to top-level windows
应该是,即使不注册,也会发送该消息。
而且注册 DBT_DEVTYP_DEVICEINTERFACE 后,首先进入的是 DBT_DEVTYP_DEVICEINTERFACE 分支,因为是U盘,所以有“USB设备”“磁盘类”的子消息进来,根据 8楼的GUID数组,跟着还是会进入 DBT_DEVTYP_VOLUME 的
至于9楼第一个问题,这个说起来就麻烦了,你用窗口消息的话,就不用考虑这个途径了。