天天看點

Ocx控件中響應 裝置拔插事件

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