注意:需要添加头文件<DBT.H>
1、在消息映射中添加
BEGIN_MESSAGE_MAP(CTestOCXCtrl, COleControl)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
2、注册
static const GUID GUID_DEVINTERFACE_LIST[] =
{
// GUID_DEVINTERFACE_USB_DEVICE USB设备的GUID
{ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }
};
void CTestOCXCtrl::wwwwwwww(void)//该方法是用来在ocx测试界面调用的
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
HDEVNOTIFY hDevNotify;
for (int i = 0; i < sizeof(GUID_DEVINTERFACE_LIST) / sizeof(GUID); i++)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if( !hDevNotify )
{
// AfxMessageBox(CString("Can't register device notification: ")
// + _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
MessageBox("regist failure.");
return;
}
}
}
3、重载OnDeviceChange(UINT nEventType,DWORD dwData)方法
BOOL CTestOCXCtrl::OnDeviceChange(UINT nEventType,DWORD dwData)
{
//MessageBox("检测到设备插入拔出");
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
//这里进行信息匹配,比如guid等
//针对各个事件进行处理.
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
TRACE("DBT_DEVICEREMOVECOMPLETE");
if (NULL != fp && dbd->dbcc_devicetype == 5)
{
...自己想干的事
}
break;
case DBT_DEVICEARRIVAL:
//insertPIDVID(dbd);
if (NULL != fp)
{
...自己想干的事
}
TRACE("DBT_DEVICEARRIVAL");
break;
default:
TRACE("%d\n", nEventType);
break;
}
return TRUE;
}
//需要注意的是,消息的注册需要在窗体加载结束后(例如可以在ondraw里,或者手动调用注册)