未装驱动,收不到WM_DEVICECHANGE怎么办?

比如,魅族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



 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值