代码改变世界

VC中添加WM_DEVICECHANGE消息(经典)

2011-10-31 12:53  捣乱小子  阅读(14952)  评论(0编辑  收藏  举报

在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_DEVICEARRIVAL:
        ::AfxMessageBox(TEXT("得到新的设备"),1,0);
        return TRUE;
    }
    return FALSE;
}

tips:其中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消息一样。