分享

MFC 消息处理方法-自定义消息-拦截-变更-拦截关机重启消息

 笔录收藏 2012-09-11

/****************************************************************
编程笔记:在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);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多