OnDeviceChange无法读取设备是接入还是拔掉-----RegisterDeviceNotification注册

本文介绍如何在Windows中使用RegisterDeviceNotification注册设备通知,并通过OnDeviceChange处理设备的接入和拔除事件。针对MTP设备,展示了具体的代码实现及事件类型的解释。
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;
}
------解决方案--------------------
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值