1. 程式人生 > >非系統訊息的使用方法及SendMessage()和PostMessage()的區別

非系統訊息的使用方法及SendMessage()和PostMessage()的區別

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(),因為它不阻塞。

SendMessage(UINT message, WPARAM w, LPARAM l)