在mfc添加WM_DEVICECHANGE不像添加WM_MOUSEMOVE(举例)等等那样直接鼠标点击之后就自动添加。当中是有封装WM_DEVICECHANGE消息的(CWnd::OnDeviceChange),括号里的东西就是msdn里面的东西,就是说CWnd是有这个函数的。
在开发的时候,我们不得不手动添加,而不是用IDE的自动添加功能。所以如果不了解mfc的消息机制的话,看起来会比较晦涩。
入主题。
①添加消息映射
BEGIN_MESSAGE_MAP(CFileCopyDlg, CDialog)
……
ON_WM_DEVICECHANGE()
……
END_MESSAGE_MAP()
②在窗口类当中添加消息响应函数
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
所有的消息响应函数都是afx_msg 开头的,而且被定义为空,按jjh的话应该是留着在后面有用的。
③定义这个函数
BOOL CFileCopyDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;
//这里进行信息匹配,比如guid等
//针对各个事件进行处理.
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
if (bFindRemovableDevice)
{
MessageBox(_T("移除USB"));
bFindRemovableDevice = FALSE;
}
break;
case DBT_DEVICEARRIVAL:
if (!bFindRemovableDevice)
{
bFindRemovableDevice = TRUE;
MessageBox(_T("发现USB"));
}
break;
default:
break;
}
return TRUE;
}tips:使用BOOL类型变量bFindRemovableDevice是为了避免多次执行热插拔消息;
其中nEventType就是WM_DEVICECHANGE消息的wParam参数,具体的值参考msdn,具体的含义直接查就好了。
DBT_CONFIGCHANGECANCELED
DBT_CONFIGCHANGED
DBT_CUSTOMEVENT
DBT_DEVICEARRIVAL
DBT_DEVICEQUERYREMOVE
DBT_DEVICEQUERYREMOVEFAILED
DBT_DEVICEREMOVECOMPLETE
DBT_DEVICEREMOVEPENDING
DBT_DEVICETYPESPECIFIC
DBT_DEVNODES_CHANGED
DBT_QUERYCHANGECONFIG
DBT_USERDEFINED
KUGOU的将歌曲发送到移动设备这个功能,应该就是通过这个消息实现,不过他是把这个消息写入了dll。
不过后来发现原来这个消息是系统给所有的程序发送的,当窗口失去焦点依然可以处理该消息,就想关机或者log off的时候会发送WM_QUERYENDSESSION消息一样。
④在初始化函数OnInitDialog()中添加注册设备接口类的代码
//注册某个USB设备接口类 事件
DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevBroadcastDeviceInterface.dbcc_classguid = { 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);通过以上4个步骤,即可进行移动设备的热插拔检测了,譬如:U盘的热插拔检测