2008년 09월 23일
왜 PreTranslateMessage()에서 SendMessage를 받지 못 할까요??

서버로 부터 핫픽(에코) 메시지를 받는 부모 프로세스(클라이언트)의 쓰레드가 있습니다. 이 쓰레드는 서버가 비정상 종료 했을 경우 이에 대한 메시지를 부모 프로세스에게 전달해 주도록 프로그램을 설계하였습니다.( 쓰레드를 돌려 놓고 종료 될 때까지 기다리자는 UI가 무한대기 상태에 빠지는 현상이 생길게 뻔해서 이런 방법을 사용했습니다 ^^) 그리고 사용자 정의 메시지를 만들고 이 메시지를 SendMessage로 날렸습니다. 이 글 제목처럼 PreTranslateMessage()가 받아주길 바란면서요 ;;

결과는 .. 이 글을 읽고 계시는 분들 중 Win32 API를 공부하신 분들은 이미 입가에 미소를 짓고 계시겠죠? ㅎㅎ 결과적으로 PreTranslateMessage()는 SendMessage로 날린 메시지를 받지 못합니다. 왜 그런지 지금부터 알아보겠습니다 :)

Win32 API로 윈도우 프로그래밍을 해보신 분들은 아래의 코드를 보신적 있으실 겁니다.


while(GetMessage(&Message, 0, 0, 0))
{
    TranslateMessage(&Message);
    DispatchMessage(&Message);
}


윈도우의 경우 메시지가 발생하게 되면 시스템 큐에 메시지가 채워지게 되고 곧 사용되어질 쓰레드 메시지 큐에 메시지가 전달되게 됩니다. 그러면 해당 쓰레드(즉 메시지를 받는 프로그램)는 GetMessage를 통해 쓰레드 큐로부터 메시지를 전달 받습니다. 그리고 이 메시지는 PreTranslateMessage를 거친 후 TranslateMessage나 DispatchMessage에 전달되게 되죠. PreTranslateMessage는 메시지는 TranslateMessage나 DispatchMessage에 전해지기 전에 처리할 필요가 있을때 사용됩니다. 
위 PreTranslateMessage의 설명에서도 언급했드시 메시지 큐로부터 전달 받은 메시지를 처리하는 역할을 하는 함수이지요. 그런데 SendMessage는 메시지를 큐에 넣는 것이 아니라 곧바로 윈도우 프로시저로 보내 즉각 처리하도록 하며 메시지가 완전히 처리되기 전에는 리턴하지 않습니다. 결국 함수를 잘못 고른거죠 ^^ 그렇다면 메시지 큐에 메시지를 전달할 수 있는 함수는 누구일까요? 바로 PostMessage입니다. 이 함수는 Msg인수로 지정된 메시지를 윈도우의 메시지 큐에 집어넣어 윈도우 프로시저에서 이 메시지를 처리하도록 합니다. 즉, PostMessage가 전달한 메시지는 메시지 큐에 전달되고 GetMessage가 이 메시지는 받은 후 PreTranslateMessage에 메시지를 전달하여 처리할 수 있도록 하는 것이지요 ^^

이건 샘플 프로그램의 코드입니다.


아래는 샘플 프로그램 실행 화면인데요 SendMessage버튼을 누르면 SendMessge를 발생 시키고 PostMessage버튼을 누르면 메시지를 메시지 큐에 전달하고 PretranslateMessage에서 이를 처리하여 "Receive PostMessage ..^^" 라는 메시지를 뿌려줍니다.

?? 아무런 반응이 없네요 ^^ SendMessage는 메시지 큐로 메시지를 보내지 않으니까요 ~~


       

오호 ~ 잘 되네요 ^^



※ 위 글에 대한 잘못된 부분이나 궁금하신 부분에 대한 피드백은 언제나 환영입니다 ~ 물론, 퍼가신다면 영광이구요. 우리나라의 모든 개발자 분들께서 바쁘시지만 서로 자신의 귀중한 경험과 지식을 공유해서 함께 발전해 나갈 수 있었으면 합니다 ^^


샘플 프로젝트 다운로드 : Message.zip

by greenfrog | 2008/09/23 21:10 | C++ / WIN32 / MFC | 트랙백 | 덧글(2)
트랙백 주소 : http://greenfrog7.egloos.com/tb/863907
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by resercher at 2013/10/29 15:59
지나가다가 한마디 씁니다 결론만 말하면
send message 로 해도 pretranslatemessage함수에 갑니다
지금 테스트를 잘못하신게 다이어로그 하나로 자신에게 sendmessage하면 응답을 기다리느라 지금 멈춰있는거같이 보이는거지 안가는게 아닙니다
다이어로그 두개로 서로 테스트 해보시면 이해가 되실겁니다
Commented by 수시아 at 2015/07/19 13:24
안녕하세요? resercher 님 sendmessage 로 보낸 메시지가 pretranslatemessage 로 가는게 맞나요?
저는 다이얼로그 두개를 띄워놓고 wm_user+1 을 sendmessage 로 보내고 있습니다만.. 도무지 들어오질 않는데요...
postmessage 로 보내는건 다 들어옵니다. 덧글 남겨주신게 맞다면 원인이 무엇일지 짐작도 안가네요..

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>