比如,魅族M9,三星I579和三星I9001等型号的手机,用如下的代码注册的,在它们未安装驱动的情况下,有可能收不到WM_DEVICECHANGE消息。
//Register message notification DEV_BROADCAST_DEVICEINTERFACE notificationFilter; ZeroMemory(¬ificationFilter, 0); notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; notificationFilter.dbcc_classguid = GUID_CLASS_USB_DEVICE; hDevNotify = RegisterDeviceNotification(hCallerWnd, ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); if(NULL == hDevNotify) { return GetLastError(); } notificationFilter.dbcc_classguid = GUID_CLASS_USBHUB; hDevNotify = RegisterDeviceNotification(hCallerWnd, ¬ificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); if(NULL == hDevNotify) { return GetLastError(); }
只需用DEVICE_NOTIFY_ALL_INTERFACE_CLASSES替代DEVICE_NOTIFY_WINDOW_HANDLE即可,代码片段如下:
int WINAPI WinMain ( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nCmdShow ) { HWND ghMainWnd = CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, MainDlgProc); } INT_PTR CALLBACK MainDlgProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, USBView_OnInitDialog); HANDLE_MSG(hWnd, WM_DEVICECHANGE, USBView_OnDeviceChange); } return 0; } BOOL USBView_OnInitDialog ( HWND hWnd, HWND hWndFocus, LPARAM lParam ) { DEV_BROADCAST_DEVICEINTERFACE broadcastInterface = {0}; // Register to receive notification when a USB device is plugged in. broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; gNotifyDevHandle = RegisterDeviceNotification(hWnd, &broadcastInterface, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); //DEVICE_NOTIFY_WINDOW_HANDLE); ///..... } BOOL USBView_OnDeviceChange ( HWND hwnd, UINT uEvent, DWORD dwEventData ) { TCHAR temp[200] = {0}; _stprintf_s(temp, sizeof(temp)/sizeof(TCHAR), TEXT("uEvent=%#x, dwEventData=%#x"), uEvent, dwEventData); OutputDebugString(temp); }
OUTPUT框里,输出结果如下:uEvent=0x7, dwEventData=0x7
//C:\WinDDK\7600.16385.1\inc\api\dbt.h /* * Message = WM_DEVICECHANGE * wParam = DBT_DEVNODES_CHANGED * lParam = 0 * * send when configmg finished a process tree batch. Some devnodes * may have been added or removed. This is used by ring3 people which * need to be refreshed whenever any devnode changed occur (like * device manager). People specific to certain devices should use * DBT_DEVICE* instead. */ #define DBT_DEVNODES_CHANGED 0x0007