不论是U盘拔插,OnDeviceChange的nEventType值总是7?
不论U盘拔插,OnDeviceChange的nEventType值总是7??
建立了ON_WM_DEVICECHANGE()消息响应,但U盘拔插nEventType总是7???
是不是还要注册什么东西的?怎么弄啊?
偶是新手,请各位多多指教!!
------解决方案--------------------
确实是要注册似乎~我这几天也在做这个~做的是删除U盘的~
------解决方案--------------------
你如果要判断U盘插入还是拔出的话,也可以换别的方法:
eg:程序初始化DWORD dw = GetLogicalDevice()
如果插入U盘的话GetLogicalDevice()的值比原来的大
这样通过判断这个值也可以~
------解决方案--------------------
RegisterDeviceNotification()
然后获取DBT_DEVICEQUERYREMOVE
------解决方案--------------------
CString str;
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)dwData;
switch(wParam)
{
case DBT_CONFIGCHANGECANCELED:break;
case DBT_CONFIGCHANGED: break;
case DBT_DEVICEQUERYREMOVE:break;
case DBT_DEVICEQUERYREMOVEFAILED:break;
case DBT_DEVICEREMOVEPENDING:break;
case DBT_DEVICETYPESPECIFIC:break;
case DBT_QUERYCHANGECONFIG:break;
case 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));
}
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));
}
------解决方案--------------------
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
DWORD Err;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid; // 这个是你关心的interface GUID
*hDevNotify = RegisterDeviceNotification( hWnd,
&NotificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE );
//*************************************************************************
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:
建立了ON_WM_DEVICECHANGE()消息响应,但U盘拔插nEventType总是7???
- C/C++ code
BOOL CTimeTestDlg::OnDeviceChange(UINT nEventType,DWORD dwData) { switch(nEventType) { case DBT_DEVICEARRIVAL: AfxMessageBox("U盘插入"); break; case DBT_DEVICEREMOVECOMPLETE: AfxMessageBox("U盘拔出"); break; } return TRUE; }
是不是还要注册什么东西的?怎么弄啊?
偶是新手,请各位多多指教!!
------解决方案--------------------
确实是要注册似乎~我这几天也在做这个~做的是删除U盘的~
------解决方案--------------------
你如果要判断U盘插入还是拔出的话,也可以换别的方法:
eg:程序初始化DWORD dw = GetLogicalDevice()
如果插入U盘的话GetLogicalDevice()的值比原来的大
这样通过判断这个值也可以~
------解决方案--------------------
RegisterDeviceNotification()
然后获取DBT_DEVICEQUERYREMOVE
------解决方案--------------------
CString str;
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)dwData;
switch(wParam)
{
case DBT_CONFIGCHANGECANCELED:break;
case DBT_CONFIGCHANGED: break;
case DBT_DEVICEQUERYREMOVE:break;
case DBT_DEVICEQUERYREMOVEFAILED:break;
case DBT_DEVICEREMOVEPENDING:break;
case DBT_DEVICETYPESPECIFIC:break;
case DBT_QUERYCHANGECONFIG:break;
case 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));
}
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));
}
------解决方案--------------------
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
DWORD Err;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid; // 这个是你关心的interface GUID
*hDevNotify = RegisterDeviceNotification( hWnd,
&NotificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE );
//*************************************************************************
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: