一、处理设备变动信息
可以在某个窗口类中使用WindowProc函数处理:
LRESULT CXXXDogDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//wParam标识事件类型,如设备插入事件、拔出事件
if(message == WM_DEVICECHANGE && (wParam == DBT_DEVICEARRIVAL || wParam == DBT_DEVICEREMOVECOMPLETE))
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
//lpdb->dbch_devicetype标识设备类型
if(lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) //此种类型需要注册,如Hid设备,只有注册了此处的代码才有作用
{
int i = 0;
++i;
}
else if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) //逻辑卷,如U盘,不需要注册
{
int i = 0;
++i;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
也可以映射消息:
ON_WM_DEVICECHANGE()
然后添加函数 :
OnDeviceChange //此函可以处理不需要注册的消息,或者已经注册的消息
二、如何注册设备消息
GUID GUID_CLASS_ITOKEN_Hid = {0};
DEV_BROADCAST_DEVICEINTERFACE dbf;
HDEVNOTIFY hDevNotify = NULL;
typedef void (__stdcall *FUNC_TYPE_HIDGUID) (LPGUID);
FUNC_TYPE_HIDGUID _HidD_GetHidGuid = NULL;
HINSTANCE hMod = LoadLibrary(_T("hid.dll"));
_HidD_GetHidGuid = (FUNC_TYPE_HIDGUID)GetProcAddress(hMod, "HidD_GetHidGuid");
ASSERT(_HidD_GetHidGuid != NULL);
_HidD_GetHidGuid(&GUID_CLASS_ITOKEN_Hid); //获得Hid设备的GUID
FreeLibrary(hMod);
memset(&dbf, 0x00, sizeof(dbf));
dbf.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
dbf.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
dbf.dbcc_classguid = GUID_CLASS_ITOKEN_Hid;
hDevNotify = RegisterDeviceNotification(m_hWnd, &dbf,DEVICE_NOTIFY_WINDOW_HANDLE);