文章类型: VC&C++
关键词: VC,添加,WM_DEVICECHANGE,消息,移动,设备,U盘,插入,拔出
内容摘要: VC中添加WM_DEVICECHANGE消息进行移动设备的自动热插拔检测

VC中添加WM_DEVICECHANGE消息进行移动设备的自动热插拔检测

2016/12/8 15:22:39    来源:apple    阅读:

在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盘的热插拔检测


↑ 上一篇文章:MFC程序的启动过程与相关函数执行顺序 关键词:mfc,null,application,command.. 发布日期:2016/12/7 17:24:42
↓ 下一篇文章:一步步详解如何打造UEFI启动,9秒开机 关键词:一步步详解如何打造UEFI启动,9秒开机 发布日期:2016/12/26 10:55:36
相关文章:
“VC动态显示并移动透明图片"的实现方法并附源码下载 关键词:VC,动态,显示,移动,透明,图片,实现方法,源码,下载 发布日期:2018-03-09 12:00
MFC OCX 控件事件的添加和处理 关键词:VC,C++,MFC,OCX,控件,事件,添加,处理 发布日期:2018-05-29 15:23
VC中给列表控件CListCtrl添加复选框 关键词:VC中给列表控件CListCtrl添加复选框 发布日期:2017-10-14 17:08
相关目录:.NETVC&C++软件开发
我要评论
正在加载评论信息......