OnDeviceChange无法读取设备是接入还是拔掉
平板以MTP方式接入xp电脑
RegisterDeviceNotification注册时DEV_BROADCAST_DEVICEINTERFACE::dbcc_classguid该输入什么
OnDeviceChange(UINT nEventType, DWORD dwData)
nEventType = 7 dwData = 0
获取不到设备信息
------解决方案--------------------
bool Cxxxx::UsbRegistNotify(void)
{
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for(int i=0; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++)
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];//我们在此只注册HID USB设备消息
hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if( !hDevNotify )
{
AfxMessageBox(_T("Can't register device notification: "));
return false;
}
}
return true;
}
LRESULT CPedometer_ConsoleDlg::OnDeviceChange(WPARAM nEventType, LPARAM dwData)//设备状态改变时的处理函数
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)dwData;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
int nLenDevId;
int idx;
CString szDevId;
CString szClass;
CString szLog;
CString id,id2,id3,id4;
CString Name;
if(!(DBT_DEVICEARRIVAL == nEventType
------解决方案--------------------
DBT_DEVICEREMOVECOMPLETE == nEventType))
return S_FALSE;
switch( pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
ASSERT(lstrlen(pDevInf->dbcc_name) > 4);
szDevId = pDevInf->dbcc_name+4;
idx = szDevId.ReverseFind(_T('#'));
ASSERT( -1 != idx );
szDevId.Left(idx);
szDevId.Replace(_T('#'), _T('\\'));
szDevId.MakeUpper();
idx = szDevId.Find(_T('\\'));
ASSERT(-1 != idx );
szClass = szDevId.Left(idx);
nLenDevId = szDevId.GetLength();
Name = pDevInf->dbcc_name;
id.Format(_T("VID_%4.4X"), MY_VID);
id3.Format(_T("Vid_%4.4x"), MY_VID);
id2.Format(_T("PID_%4.4X"), MY_PID1);
id4.Format(_T("Pid_%4.4x"), MY_PID1);
if(((Name.Find(id3, 0) == -1) && (Name.Find(id4, 0) == -1)) && ((Name.Find(id, 0) == -1) && (Name.Find(id2, 0) == -1)))
break;
if (DBT_DEVICEARRIVAL == nEventType )
;插入
else
;拔除设备
AddCom();
UpdateData(false);
((CButton*)GetDlgItem(IDC_BUTTON1))->SetWindowTextW(_T("Connect"));
break;
default:
break;
}
return TRUE;
}
------解决方案--------------------
平板以MTP方式接入xp电脑
RegisterDeviceNotification注册时DEV_BROADCAST_DEVICEINTERFACE::dbcc_classguid该输入什么
OnDeviceChange(UINT nEventType, DWORD dwData)
nEventType = 7 dwData = 0
获取不到设备信息
------解决方案--------------------
bool Cxxxx::UsbRegistNotify(void)
{
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for(int i=0; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++)
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];//我们在此只注册HID USB设备消息
hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if( !hDevNotify )
{
AfxMessageBox(_T("Can't register device notification: "));
return false;
}
}
return true;
}
LRESULT CPedometer_ConsoleDlg::OnDeviceChange(WPARAM nEventType, LPARAM dwData)//设备状态改变时的处理函数
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)dwData;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
int nLenDevId;
int idx;
CString szDevId;
CString szClass;
CString szLog;
CString id,id2,id3,id4;
CString Name;
if(!(DBT_DEVICEARRIVAL == nEventType
------解决方案--------------------
DBT_DEVICEREMOVECOMPLETE == nEventType))
return S_FALSE;
switch( pHdr->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
ASSERT(lstrlen(pDevInf->dbcc_name) > 4);
szDevId = pDevInf->dbcc_name+4;
idx = szDevId.ReverseFind(_T('#'));
ASSERT( -1 != idx );
szDevId.Left(idx);
szDevId.Replace(_T('#'), _T('\\'));
szDevId.MakeUpper();
idx = szDevId.Find(_T('\\'));
ASSERT(-1 != idx );
szClass = szDevId.Left(idx);
nLenDevId = szDevId.GetLength();
Name = pDevInf->dbcc_name;
id.Format(_T("VID_%4.4X"), MY_VID);
id3.Format(_T("Vid_%4.4x"), MY_VID);
id2.Format(_T("PID_%4.4X"), MY_PID1);
id4.Format(_T("Pid_%4.4x"), MY_PID1);
if(((Name.Find(id3, 0) == -1) && (Name.Find(id4, 0) == -1)) && ((Name.Find(id, 0) == -1) && (Name.Find(id2, 0) == -1)))
break;
if (DBT_DEVICEARRIVAL == nEventType )
;插入
else
;拔除设备
AddCom();
UpdateData(false);
((CButton*)GetDlgItem(IDC_BUTTON1))->SetWindowTextW(_T("Connect"));
break;
default:
break;
}
return TRUE;
}
------解决方案--------------------
DBT_DEVICEARRIVAL A device has been inserted and is now available. DBT_DEVICEQUERYREMOVE Permission to remove a device is requested. Any application can deny this request and cancel the removal. DBT_DEVICEQUERYREMOVEFAILED Request to remove a device has been canceled. DBT_DEVICEREMOVEPENDING Device is about to be removed. Cannot be denied. DBT_DEVICEREMOVECOMPLETE Device has been removed. DBT_DEVICETYPESPECIFIC Device-specific event. DBT_CONFIGCHANGED Current configuration has changed. DBT_DEVNODES_CHANGED Device node has changed.