컴퓨터 공부/Win32 API 프로그래밍

[5월 6일 1교시] 메세지2

려리군 2009. 5. 6. 15:16

메세지 처리 함수

BOOL PostMessage(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

hWnd 메세지 큐에 iMessage를 집어 넣는다. 메세지를 처리하기 위한 쓰레드를 기다리지 않는다.

리턴 : 성공시 TRUE, 실패시 FALSE


BOOL PostThreadMessage(DWORD idThread, UINT iMessage, WPARAM wParam, LPARAM lParam);

특정 쓰레드에 해당하는 메세지 큐에 iMessage를 집어 넣는다.

리턴 : 성공시 TRUE, 실패시 FALSE


LRESULT SendMessage(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

hWnd 윈도우 프로시저로 iMessage를 즉각 보낸다. 

메세지를 처리하기 위한 쓰레드를 기다리므로 hWnd 윈도우(다른 쓰레드)가 리턴하기 전까지 block된다.


다른 윈도우가 메세지를 보낼 때 SendMessage가 block되었을 경우.

※ 메세지 펌핑은 같은 쓰레드 내의 윈도우 만을 대상으로 한다. 

    같은 쓰레드 내의 윈도우끼리 메세지를 주고 받을 때는 (MessageBox가) block되지 않음.

해결방법
1. 즉시 리턴해주고 다른 작업을 한다.
예시
if(InSendMessage())
        ReplyMessage(TRUE);

BOOL InSendMessage()
다른 쓰레드에서 보낸 메세지(SendMessage)를 처리(확인)한다.
리턴 : 처리를 한다면 TRUE 처리를 안한다면 FALSE
BOOL ReplyMessage(LRESULT lResult);
다른 쓰레드에서 보낸 메세지(SendMessage)에 대해 lResult로 답변한다.
리턴 : 처리를 한다면 TRUE 처리를 안한다면 FALSE
lResult : 메세지 처리의 결과값. 보내진 메세지에 의해 값이 결정됨.

2. 송신측에서 다른 종류의 Send???Message???함수 사용.
BOOL SendNotifyMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
다른 쓰레드에서 메세지를 보낼 경우 block하지 않고 바로 리턴한다.
리턴 : 성공시 TRUE, 실패시 FALSE
LRESULT SendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags, UINT uTimeout, PDWORD_PTR lpdwResult);
지정한 경과시간 이상이 지나면 메세지 처리 여부에 상관 없이 즉시 리턴. 무한히 대기 하지 않도록 한다.
리턴 : 

메세지 콜백
브로드캐스팅