非系統訊息的使用方法及SendMessage()和PostMessage()的區別
阿新 • • 發佈:2019-02-05
1.SendMessage()和PostMessage()相同點:
a)能夠向指定的視窗內傳送視窗訊息,既可以是本程序內視窗也可以是其他程序的;(要用FindWindow查詢其他程序的控制代碼)
b)既可以傳送系統訊息(例如WM_LBUTTONDOWM,WM_MOUSEMOVE),範圍是1-(WM_USER-1),也可以傳送非系統訊息(開發者定義的訊息),範圍是WM_USER-0x7FFF。
開發者自己定義的非系統訊息範圍必須是 WM_USER-0x7FFF 之間的,非系統訊息主要是用來傳遞資料的,下面我們就來看一個傳送非系統訊息的使用例子,如下:
建立完非系統訊息傳送的程式碼之後(點選按鍵時傳送),現在要需要截獲使用者定義的訊息,操作步驟如下:// 非系統訊息主要是用來傳遞資料 enum{WM_TEST = WM_USER+10}; // 訊息種類只要在WM_USER-0x7FFF就可以,不能再系統訊息之內 void CMyDlg::OnNosysmessage() // 按鍵點選後傳送非系統訊息 { // 引數1:訊息型別 WM_TEST // 引數2: // 引數3: SendMessage(WM_TEST, 0x1234, 0x5678); }
a)首先建立一個成員函式,用於接收非系統訊息
// 自己先建立一個這樣的成員函式,用於接收非系統訊息
LRESULT CMyDlg::OnTestMsg(WPARAM w, LPARAM l)
{
return w+l;
}
b)人工加入訊息對映
這裡之所以把我們對映關係和系統的對映關係分開,是因為破換了系統的對映表,我們放在系統對映關係表的外面就行。BEGIN_MESSAGE_MAP(CMyDlg, CDialog) <span style="color:#ff0000;">ON_MESSAGE(WM_TEST, OnTestMsg)</span> //{{AFX_MSG_MAP(CMyDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_LBUTTONDOWN() ON_BN_CLICKED(IDC_SIMULATEMESSAGE, OnSimulatemessage) ON_BN_CLICKED(IDC_NOSYSMESSAGE, OnNosysmessage) //}}AFX_MSG_MAP END_MESSAGE_MAP()
這樣就建立好了非系統的訊息對映函式。我們可以執行程式進行測試了。
2.SendMessage()和PostMessage()的不同點:
LRESULT SendMessage(UINT message, WPARAM w, LPARAM l);
BOOL PostMessage(UINT message, WPARAM w, LPARAM l);
a)SendMessage()是阻塞型的函式,把訊息傳送給訊息佇列後,在訊息沒有響應完之前這個函式是不會返回的,返回值和訊息處理函式時是有直接關係的,訊息處理函式返回什麼,SendMessage就返回什麼引數。而PostMessage()是非阻塞型函式,把訊息丟擲去之後就返回,不管訊息是否響應,返回的是傳送的成功和失敗,一般是很少失敗,除非視窗不存在。
b)跨現成或者跨程序傳送訊息時推薦使用PostMessage(),因為它不阻塞。