注意:需要添加頭檔案<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裡,或者手動調用注冊)