我在编码检测USB设备的时候遇到一个问题,一直解决不了。待检测的USB设备是自行设计的,可以正常工作。
在程序中,我用OnUSBChange(WPARAM wParam, LPARAM lParam)函数响应WM_DEVICECHANGE消息。为了简单起见,我将代码简化如下:
LRESULT CMainFrame::OnUSBChange(WPARAM wParam, LPARAM lParam)
{
DEV_BROADCAST_HDR *pDEV = (DEV_BROADCAST_HDR*)lParam;
if (wParam == DBT_DEVICEARRIVAL)
{
AfxMessageBox("OK");
}
if (wParam == DBT_DEVICEREMOVECOMPLETE)
{
AfxMessageBox("NO");
}
return CWnd::OnDeviceChange(wParam, lParam);
}
由于担心没有注册消息,我又添加了函数RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode),代码如下
void CMainFrame::RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode)
{
DEV_BROADCAST_DEVICEINTERFACE *pFilterData =
(DEV_BROADCAST_DEVICEINTERFACE*)
_alloca(sizeof(DEV_BROADCAST_DEVICEINTERFACE));
ASSERT (pFilterData);
UUID GUID_CLASS_INPUT;
UuidFromString((unsigned char*)"36FC9E60-C465-11CF-8056-444553540000", &GUID_CLASS_INPUT);
ZeroMemory(pFilterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
pFilterData->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
pFilterData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
pFilterData->dbcc_classguid = GUID_CLASS_INPUT;
*hNotifyDevNode = RegisterDeviceNotification(hDlg, pFilterData, DEVICE_NOTIFY_WINDOW_HANDLE);
}
这个函数在窗体创建时调用。
按照我的设想,在我的USB设备拔插的时候应该有WM_DEVICECHANGE消息,触发响应函数,而函数的参数wParam应该是DBT_DEVICEARRIVAL或者DBT_DEVICEREMOVECOMPLETE。
但实际测试时,我发现WM_DEIVCECHANGE消息始终能发出,函数能正确响应,可wParam的值始终为7,不是我们需要的值。
程序不变,我又拿U盘和移动硬盘作了测试,结果可以正确获取DBT_DEVICEARRIVAL或者DBT_DEVICEREMOVECOMPLETE。
不知我的代码在哪出了问题,为什么不能检测自己的USB设备呢? |