/****************************************************************
编程笔记:在MFC中常用的消息处理方法
编写作者:Coderui
整理日期:2009年11月04日
编写语言:C++(MFC)
编译环境:VC++ 6.0
联系邮箱:
作者博客:http://hi.baidu.com/coderui
****************************************************************/
一、自定义消息
假如想在CMyMessageDlg类中添加自定义消息:
1、在头文件"MyMessageDlg.h"中添加自定义消息的宏声明:
#define WM_USER_MYMESSAGE WM_USER + 100
2、在头文件"MyMessageDlg.h"中添加消息映射函数的声明:
afx_msg void OnMyMessageProc(WPARAM wParam, LPARAM lParam);
3、在文件"MyMessageDlg.cpp"中添加处理自定义消息的宏:
ON_MESSAGE(WM_USER_MYMESSAGE, OnMyMessageProc)
4、在文件"MyMessageDlg.cpp"中添加自定义消息函数的实现部分:
void CMyMessageDlg::OnMyMessageProc(WPARAM wParam, LPARAM lParam)
{
// ……
}
5、触发自定义消息的方法:
void CMyMessageDlg::OnOK()
{
// 调用自定义消息
SendMessage(WM_USER_MYMESSAGE, (WPARAM)0, (LPARAM)0);
}
二、消息拦截
假如想拦截自定义消息“WM_USER_MYMESSAGE”和系统消息“WM_SIZE”:
#define WM_USERMESSAGE_NULL WM_USER+32 // 自定义消息
重载WindowProc函数,在函数中实现消息的拦截
LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch (message)
{
case WM_USERMESSAGE:
AfxMessageBox("自定义消息拦截");
// 如果在这里把消息销毁掉,不让其正确转发,则对应的消息处理函数就不会被调用了。
// message WM_USERMESSAGE_NULL;
break ;
case WM_SIZE:
AfxMessageBox("系统消息拦截");
break ;
}
return CDialog::WindowProc(message, wParam, lParam);
}
三、消息变更
假如接到消息“WM_USER_MYMESSAGE1”后,需要根据条件来判断是否需要变更消息:
#define WM_USER_MYMESSAGE1 WM_USER + 101
#define WM_USER_MYMESSAGE2 WM_USER + 102
重载WindowProc函数,在函数中实现消息的拦截
LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch (message)
{
case WM_USER_MYMESSAGE1:
if (条件判断)
{
// 把消息变更为其它消息
message = WM_USER_MYMESSAGE2;
}
break ;
}
return CDialog::WindowProc(message, wParam, lParam);
}
四、例子:拦截系统注销、重启和关机消息的例子
假如想把系统注销、重启和关机的消息都拦截下来,并销毁掉,不让其执行注销、重启和关机等操作:
#define WM_USERMESSAGE_NULL WM_USER+32 // 自定义消息
LRESULT CMyMessageDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
// WM_QUERYENDSESSION消息是Windows向你询问Windows能否关闭
// WM_ENDSESSION消息表示提示你Windows即将关闭。
switch(message)
{
case WM_ENDSESSION:
AfxMessageBox("消息拦截1");
// 把消息销毁掉,不让其正确转发。
message = WM_USERMESSAGE_NULL;
break ;
case WM_QUERYENDSESSION:
AfxMessageBox("消息拦截2");
// 把消息销毁掉,不让其正确转发。
message = WM_USERMESSAGE_NULL;
break ;
}
return CDialog::WindowProc(message, wParam, lParam);
}