메세지 처리 함수
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);
지정한 경과시간 이상이 지나면 메세지 처리 여부에 상관 없이 즉시 리턴. 무한히 대기 하지 않도록 한다.
리턴 :
메세지 콜백
브로드캐스팅
'컴퓨터 공부 > Win32 API 프로그래밍' 카테고리의 다른 글
[5월 6일 3교시] 메세지 크래커 + 공통 컨트롤 1 (0) | 2009.05.06 |
---|---|
[5월 6일 2교시] 서브클래싱 + 후킹 (0) | 2009.05.06 |
[스터디] 윈도우즈 API 정복2 - 35장 레지스트리. (0) | 2009.05.06 |
[5월 1일 3교시] 대화상자 2 + 메세지1 (0) | 2009.05.01 |
[5월 1일 2교시] 대화상자 1 (0) | 2009.05.01 |