PostMessage

원형

LRESULT PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

인수

▶hWnd : 메시지를 받을 윈도우 핸들. HWND_BROADCAST일 경우 모든 최상위 윈도우에게 보내진다. 숨겨진 윈도우나 사용금지된 윈도우도 포함되며 오버랩드, 팝업 윈도우도 포함된다. 단 차일드 윈도우에게는 보내지지 않는다. NULL일 경우 PostThreadMessage 함수와 같아지며 특정한 대상 윈도우없이 스레드에게 메시지를 보낸다.

▶Msg : 붙일 메시지

▶wParam : 메시지 추가 정보. 메시지에 따라 의미가 달라진다.

▶lParam : 메시지 추가 정보.

리턴

메시지 붙이기에 성공하면 0이 아닌 값을 리턴한다.

설명

메시지를 해당 윈도우의 메시지 큐에 붙이며 즉시 리턴한다. 이렇게 붙여진 메시지는 메시지 루프의 GetMessage 함수에 의해 꺼내져서 DiepatchMessage 함수에 의해 윈도우 프로시저로 보내지며 최종적으로 윈도우 프로시저에 의해 처리된다.

SendMessage와는 달리 메시지를 큐에 붙인 후 곧바로 리턴하므로 이 메시지는 곧바로 처리되지 않으며 메시지를 붙인 스레드는 곧바로 다른 작업을 할 수 있다.

메시지를 붙이는 시점과 메시지를 처리하는 시점이 비동기적이기 때문에 PostMessage의 wParam, lParam으로 포인터를 전달하는 것은 의미가 없다. 메시지를 붙일 때 존재하던 값이 메시지를 처리하는 시점에서는 사라질 수 있기 때문이다. 특히 WM_COPYDATA 메시지는 임시적인 데이터를 전역 공유 메모리에 생성한 후 전달하는데 이 메시지는 절대로 PostMessage로 붙일 수 없으며 SendMessage로만 보내야 한다.

PostMessage 호출의 아주 특수한 경우로 첫번째 인수가 NULL일 수도 있는데 이 경우는 특정 윈도우에게 메시지를 붙이는 것이 아니라 응용 프로그램 전반에 걸친 작업 지시를 보내는 경우이다. 대상 윈도우가 없기 때문에 이렇게 붙여진 메시지는 윈도우 프로시저까지 전달되지 않으며 메시지 루프에서 직접 처리해야 한다. 이때의 메시지 루프는 다음과 같이 작성한다.

while(GetMessage(&Message,0,0,0)) {
	if (Message.message==WM_SOME) {
		// 직접 처리
	} else {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
}

GetMessage로 읽은 메시지가 대상 윈도우가 없는 스레드 전반에 걸친 메시지이므로 DispatchMessage를 호출하기 전에 while루프 내부에서 직접 처리해 주어야 한다.

참고함수

SendMessage : 메시지를 큐를 거치지 않고 직접 윈도우 프로시저로 보내 처리하도록 한다.

PostThreadMessage

플렛폼

95이상

본문참조

 


written by http://www.winapi.co.kr