1.新建一個Dialog based的MFC工程MSG
2.在資源管理器中打開對話框IDD_MSG_DIALOG,在其中放置一下控件:
(1)ID號爲ID_SENDMSG的發送消息按鈕(原IDOK按鈕)
(2)ID號爲IDCANCEL的取消按鈕
(3)ID號爲IDC_STATIC的靜態控件,CAPTION爲“您發送消息的次數統計:”
(4)ID號爲IDC_EDIT的編輯控件。
3.在MSGDlg.h頭文件中自定義消息:#define WM_COUNT_MSG WM_USER+100
4.在MSGDlg.h頭文件中添加消息處理函數的聲明
afx_msg LRESULT OnCountMsg(WPARAM,LPARAM);
5. 在CMSGDlg類實現文件MSGDlg.cpp中的消息映射表中加入自定義消息映射:
BEGIN_MESSAGE_MAP(CMSGDlg, CDialog)
//{{AFX_MSG_MAP(CMSGDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_COUNT_MSG,OnCountMsg)
ON_BN_CLICKED(ID_SENDMSG, OnSendmsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
6.在CMSGDlg類實現文件MSGDlg.cpp中定義“發消息”按鈕消息響應
void CMSGDlg::OnSendmsg()
{
// TODO: Add your control notification handler code here
staticint count;
++count;
this->SendMessage(WM_COUNT_MSG,0,count);
}
7.在CMSGDlg類實現文件MSGDlg.cpp中定義OnCountMsg消息響應
//自定義消息處理函數
LRESULT CMSGDlg::OnCountMsg(WPARAM wParam,LPARAM lParam)
{
this->SetDlgItemInt(IDC_EDIT,lParam);
return 1;
}
8.SendMessage函數的API原型爲:
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
其中hWnd標識接收消息的窗口。
以下程序用來向記事本Notepad發送一個WM_CLOSE消息以關閉記事本窗口。
// TellToClose.cpp文件
//::FindWindow&::SendMessage
#include"stdafx.h"
#include<windows.h>
int main(int argc,char* argv[])
{
// 查找標題爲“無標題- 記事本”的窗口
// 也可以使用類名來查找,如
// HWND hWnd =::FindWindow("Notepad", NULL);
HWND hWnd = ::FindWindow(NULL, "無標題- 記事本");
if(hWnd != NULL)
{
// 向目標窗口發送WM_CLOSE消息
::SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}
另外還有一個函數:
BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
注意SendMessage直到消息被處理完畢後才返回,而PostMessage是把一條消息投放到創建hWnd窗口的線程的消息隊列中。函數不等消息被處理就立即返回。
如果開啓了記事本程序,則運行以上程序記事本關閉。
另附PeekMessage和GetMessage的區別:
PeekMessage 返回 TRUE 的條件是有消息,如果沒有消息返回
FALSE
GetMessage 返回 TRUE 的條件是有消息且該消息不爲 WM_QUIT
返回 FALSE 的條件是有消息且該消息 爲 WM_QUIT
9.在MFC中SendMessage函數封裝到CWnd類中:
CWnd::SendMessage
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
返回值:消息處理的結果;它的值依賴於發送的消息。
參數:
message指定了要發送的消息;
wParam和lParam指定了與消息有關的附加信息。
wParam和lParam是Windows消息機制的兩個最重要參數,整個Windows依靠這兩個參數傳遞各種各樣的消息。
首先是wParam,它表示此次的消息類型是什麼。是鍵盤?是鼠標?鍵盤裏又分按下還是擡起,鼠標裏又分是單擊還是雙擊,等等。
lParam是一個指針,它指向本條消息所存儲的信息的內存區域的首地址,很顯然,這個地址存放的東西是很靈活的,比如鼠標消息,那麼這裏可能存放的是各鍵的狀態或者光標的X,Y座標。換成鍵盤消息,則是鍵碼等等。
總之,在Windows系統消息處理中,wParam參數區分了類別,lParam參數存放了該類別所存儲的信息。
對於自定義消息,我們把消息Msg投遞(Send或Post)到 hWnd,其對應的消息處理函數一般爲afx_msg LRESULT OnMsg(WPARAM,LPARAM);格式,故我們可以自定義這兩個參數,以傳遞所需參數(一般爲常規類型、結構或類的指針)到指定窗口線程。
例如: SendMessage(WM_MYMESSAGE,(WPARAM)lpMyData1,(LPARAM)lpMyData2);
參考:
1.http://topic.csdn.net/t/20021223/15/1291875.html
2. http://blog.sina.com.cn/s/blog_4a657c5a0100cgxy.html
3.《Windows程序設計》王豔平