본문 바로가기

Programming/API

GetMessage vs. PeekMessage

우리는 지금까지 WinMain의 메인 루프에서 GetMessage라는 함수를 통해 메시지를 받아 처리하였다. 그리고 스크린에 무언가를 그리기 위해서는 WM_PAINT라는 메시지가 들어올 때에만 처리하였다. 이것은 무엇을 의미하는가?! 맞다. WM_PAINT 메시지가 들어오지 않으면 화면에 그리는 작업을 하지 않는다는 것이다.

게임과 같은 프로그램을 생각해보자. 게임과 같은 프로그램에서는 쉴새없이 스크린에 무언가를 그리는 작업을 한다. 당연히 쉴새없이 그려야지만 케릭터의 이동이나 다른 모든 화면의 움직임이 끊기지 않고 부드럽게 이어질 수 있는 것이다. 만약, 이러한 프로그램에서 GetMessage를 통해 메시지를 처리한다면 어떻게 될까? 결과는 불 보듯 뻔하다. 우리는 마우스를 한 손에 부여 잡고 (지속적으로 끊기는 화면에서) 로보트 춤을 추고 있는 우리의 느릿한 주인공을 조종하는데 지쳐 프로그램을 종료해 버릴 것이다. 아~ 대단히 비극적인 일이 아닐 수 없다. :)

하지만 고맙게도 현실은 그렇지 않다. 우리는 부드럽~게 움직이는 케릭터를 조종하며 온갖 화려한 마법을 쓰고 있다. 무엇이 이를 가능케 하는가?! 바로 PeekMessage 함수이다.

BOOL PeekMessage(   LPMSG lpMsg,         // MSG 구조체에 대한 포인터  
                    HWND hWnd,           // 윈도우에 대한 핸들 
                    UINT wMsgFilterMin,  // 첫번째 메시지 
                    UINT wMsgFilterMax,  // 마지막 메시지 
                    UINT wRemoveMsg      // 제거 플래그);
위에서 보는 것과 같이 PeekMessageGetMessage 함수와 유사하다. 가장 큰 차이점이 있다면 GetMessage 함수는 메시지가 도착하여야지만 리턴되는데 반해(blocking 함수임), PeekMessage 함수는 메시지 큐에 도착한 메시지가 없어도 그냥 리턴한다(non-blocking 함수임)는 점이다.
Parameters
lpMsg: 메시지 정보를 받아올 MSG 구조체에 대한 포인터
hWnd: 메시지의 대상 윈도우. -1로 지정되면 PeekMessage는 hWnd 값이 NULL인, 즉 PostThreadMessage에 의해 포스트된 메시지만을 리턴한다.
wMsgFilterMin, wMsgFilterMax: 둘 다 0으로 지정하면 필터링없이 모든 메시지를 리턴한다. 만약, 모든 키보드 메시지를 받고 싶다면 각각 WM_KEYFIRST와 WM_KEYLAST로 지정하며, 모든 마우스 메시지를 받고 싶다면 각각 MOUSEFIRST와 WM_MOUSELAST로 지정한다.
wRemoveMsg:
PM_NOREMOVE: PeekMessage 수행 후에 메시지 큐에서 메시지가 제거되지 않음.
PM_REMOVE: PeekMessage 수행 후에는 메시지 큐에서 해당 메시지가 제거됨.
이 외에도 PM_NOYIELD, PM_QS_INPUT, PM_QS_PAINT, PM_QS_POSTMESSAGE, PM_QS_SENDMESSAGE 등의 메시지가 있다. 자세한 내용은 MSDN을 참조하기 바란다.

'Programming > API' 카테고리의 다른 글

timeGetTime & GetTickCount  (0) 2009.11.20
SendMessage vs. PostMessage  (0) 2009.11.06
프레임 출력  (0) 2009.11.06
기본 세팅 파일  (0) 2009.11.06