WIN32傳送自定義訊息

安兒IT發表於2020-11-05

WIN32訊息機制中,系統會傳送各種訊息到訊息佇列,開發可以呼叫GetMessage得到相關訊息。

WIN32的API也提供了對應開發自行的傳送訊息到訊息佇列的功能.

SendMessageA直接傳送訊息到對應的視窗處理函式中,直到處理後函式才返回。

PostMessageA將資訊放入訊息佇列中,立即返回。


//訊息處理器
LRESULT CALLBACK MYWNDPROC(HWND hwind, UINT unit, WPARAM wp, LPARAM lp) {
	if (WM_COMMAND == unit) //按鈕訊息和快捷鍵
	{
		
	}
	return DefWindowProc(hwind, unit, wp, lp);
}

int main(){
	//載入快捷鍵資源
	auto  accelarator =LoadAccelerators(hInstance, MAKEINTRESOURCEA(IDR_ACCELERATOR2));

	//直接傳送訊息到訊息處理器MYWNDPROC 然後在執行GetMessage函式
	SendMessageA(hwnd, WM_COMMAND,0,0);

	//PostMessageA();
	//5訊息迴圈
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//如果傳送的訊息能被翻譯成快捷鍵訊息那麼,就不需要在分發了,
		//TranslateAccelerator會傳送WM_COMMAND訊息
		if (!TranslateAccelerator(hwnd, accelarator, &msg))
		{
			MYWNDPROC(msg.hwnd, msg.message, msg.wParam, msg.lParam);
			系統預設幫我們自動分發的到類關聯的函式
			DispatchMessage(&msg);
			TranslateMessage(&msg);
		}
	
	}
}

上面的時序如下圖
在這裡插入圖片描述
如果上面的程式碼更換為PostMessageA


//訊息處理器
LRESULT CALLBACK MYWNDPROC(HWND hwind, UINT unit, WPARAM wp, LPARAM lp) {
	if (WM_COMMAND == unit) //按鈕訊息和快捷鍵
	{
		
	}
	return DefWindowProc(hwind, unit, wp, lp);
}

int main(){
	//載入快捷鍵資源
	auto  accelarator =LoadAccelerators(hInstance, MAKEINTRESOURCEA(IDR_ACCELERATOR2));

	//將訊息插入到訊息佇列中,然後立即返回
	PostMessageA(hwnd, WM_COMMAND,0,0);
	//5訊息迴圈
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//如果傳送的訊息能被翻譯成快捷鍵訊息那麼,就不需要在分發了,
		//TranslateAccelerator會傳送WM_COMMAND訊息
		if (!TranslateAccelerator(hwnd, accelarator, &msg))
		{
			MYWNDPROC(msg.hwnd, msg.message, msg.wParam, msg.lParam);
			系統預設幫我們自動分發的到類關聯的函式
			DispatchMessage(&msg);
			TranslateMessage(&msg);
		}
	
	}
}

在這裡插入圖片描述

傳送自定義型別訊息

我可以通過上述兩個API傳送(SendMessageA PostMessageA)系統定義的訊息型別,當然也可以傳送我們的自己的訊息。
但是為了避免和系統定義的訊息型別衝突WIN32提供特殊的巨集定義.
#define WM_USER 0x0400
我們只需要自定義自己訊息型別加上WM_USER即可.

	int MY_MESSAGE = WM_USER + 1;
	SendMessageA(hwnd, MY_MESSAGE,0,0);

相關文章