/****************************************************************
編程筆記:在MFC中常用的消息處理方法
編寫作者:Coderui
整理日期:2009年11月04日
編寫語言:C++(MFC)
編譯環(huán)境:VC++ 6.0
聯(lián)系郵箱:
作者博客:http://hi.baidu.com/coderui
****************************************************************/
一、自定義消息
假如想在CMyMessageDlg類中添加自定義消息:
1、在頭文件"MyMessageDlg.h"中添加自定義消息的宏聲明:
#define WM_USER_MYMESSAGE WM_USER + 100
2、在頭文件"MyMessageDlg.h"中添加消息映射函數(shù)的聲明:
afx_msg void OnMyMessageProc(WPARAM wParam, LPARAM lParam);
3、在文件"MyMessageDlg.cpp"中添加處理自定義消息的宏:
ON_MESSAGE(WM_USER_MYMESSAGE, OnMyMessageProc)
4、在文件"MyMessageDlg.cpp"中添加自定義消息函數(shù)的實現(xiàn)部分:
void CMyMessageDlg::OnMyMessageProc(WPARAM wParam, LPARAM lParam)
{
// ……
}
5、觸發(fā)自定義消息的方法:
void CMyMessageDlg::OnOK()
{
// 調用自定義消息
SendMessage(WM_USER_MYMESSAGE, (WPARAM)0, (LPARAM)0);
}
二、消息攔截
假如想攔截自定義消息“WM_USER_MYMESSAGE”和系統(tǒng)消息“WM_SIZE”:
#define WM_USERMESSAGE_NULL WM_USER+32 // 自定義消息
重載WindowProc函數(shù),在函數(shù)中實現(xiàn)消息的攔截
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("自定義消息攔截");
// 如果在這里把消息銷毀掉,不讓其正確轉發(fā),則對應的消息處理函數(shù)就不會被調用了。
// message WM_USERMESSAGE_NULL;
break ;
case WM_SIZE:
AfxMessageBox("系統(tǒng)消息攔截");
break ;
}
return CDialog::WindowProc(message, wParam, lParam);
}
三、消息變更
假如接到消息“WM_USER_MYMESSAGE1”后,需要根據(jù)條件來判斷是否需要變更消息:
#define WM_USER_MYMESSAGE1 WM_USER + 101
#define WM_USER_MYMESSAGE2 WM_USER + 102
重載WindowProc函數(shù),在函數(shù)中實現(xiàn)消息的攔截
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);
}
四、例子:攔截系統(tǒng)注銷、重啟和關機消息的例子
假如想把系統(tǒng)注銷、重啟和關機的消息都攔截下來,并銷毀掉,不讓其執(zhí)行注銷、重啟和關機等操作:
#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");
// 把消息銷毀掉,不讓其正確轉發(fā)。
message = WM_USERMESSAGE_NULL;
break ;
case WM_QUERYENDSESSION:
AfxMessageBox("消息攔截2");
// 把消息銷毀掉,不讓其正確轉發(fā)。
message = WM_USERMESSAGE_NULL;
break ;
}
return CDialog::WindowProc(message, wParam, lParam);
}