SendMessage

원형 LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
인수

▶hWnd : 메시지를 받을 윈도우 핸들. HWND_BROADCAST일 경우 모든 최상위 윈도우에게 보내진다. 숨겨진 윈도우나 사용금지된 윈도우도 포함되며 오버랩드, 팝업 윈도우도 포함된다. 단 차일드 윈도우에게는 보내지지 않는다.

▶Msg : 전달할 메시지

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

▶lParam : 메시지 추가 정보.

리턴 메시지를 처리한 결과가 리턴된다. 리턴값은 전달되는 메시지에 따라 달라진다.
설명

메시지를 윈도우에게 보낸다. 해당 윈도우의 윈도우 프로시저를 호출하여 이 메시지가 완전히 처리되기 전에는 리턴하지 않는다. 같은 스레드에 속한 윈도우에게 메시지를 보낼 때는 마치 서브루틴을 호출하는 것과 동일하다. 예를 들어 메인 윈도우가 차일드 윈도우인 리스트 박스에게 LB_ADDSTRING이나 LB_GETCOUNT 등의 메시지를 보내면 리스트 박스는 해당 동작을 수행하는 서브루틴을 호출하고 이 동작이 완료될 때까지 SendMessage는 리턴하지 않는다.

다른 스레드에 속한 윈도우에게 메시지를 보낼 때는 스레드 스위칭이 발생하며 메시지를 받는 스레드가 메시지를 읽는 코드를 실행중이어야 한다. 만약 메시지를 받는 스레드가 메시지 처리에 오랜 시간을 소모한다면 SendMessage를 호출한 스레드는 이 함수가 리턴할 때까지 블록 상태로 남아있게 된다.

예제 1

리스트 박스를 생성하고 문자열을 하나 추가한다.

HWND hList;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_CREATE:
		hList=CreateWindow("listbox",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER,
			10,10,100,200,hWnd,(HMENU)0,g_hInst,NULL);
		SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"문자열");
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

리스트 박스로 문자열을 추가할 때는 LB_ADDSTRING 메시지를 보내주면 된다. 이와 같이 부모 윈도우가 차일드에게 명령을 내리거나 상태를 조사하는 가장 기본적인 방법은 SendMessage로 메시지를 보내는 것이다. 각 차일드별로 보낼 수 있는 메시지의 종류가 다양하다.

SendMessage 함수는 보낸 메시지가 완전히 처리되기 전에는 리턴하지 않는 블록 특성을 가지고 있다. 특히 이런 특성은 다른 스레드간에 메시지를 주고 받을 때 자주 목격되는데 이 문제를 해결하는 방법에 대해서는 InSendMessage 함수를 참고하기 바란다.

WM_COPYDATA 등의 특정 메시지는 반드시 SendMessage 함수로만 보내야 하며 PostMessage를 쓸 수 없는 것도 있다.

참고함수

PostMessage : 메시지를 큐에 붙이기만 하고 즉시 리턴한다.

InSendMessage, ReplyMessage, SendDlgItemMessage

플렛폼95이상
본문참조 

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