본문 바로가기

프로그래밍/공부관련

GetMessage와 PeekMessage

GetMessage와 PeekMessage 두 함수 모두 WinMain()에서 메세지큐로 부터 메세지를 추출하는 함수이다.

 

 하지만 차이점이 존재한다. GetMessage()함수는 메세지큐에 메세지가 없으면 그냥 그대로 반환 값을 반환 하지도 않고 그대로 대기상태로 있다가 메세지가 생기면 해당 메세지를 추출하고 반환 값으로 1을 리턴한다. 물론 메세지가 있을때 항상 1만 리턴하는 건 아니다. WM_QUIT 메세지가 발생했을때는 0을 리턴한다.

 

while(GetMessage(&msg, NULL, 0, 0) //GetMessage()가 반환 값으로 0을 리턴해야 이 while문을 빠져 나갈수 있다.

{

    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
     }

}

 

 

그에 비해 PeekMessage()함수는 GetMessage()와 다르게 매 프레임마다 함수가 실행되면 메세지 큐를 검사하고 항상 반환 값으로 1을 반환 한다는 것이다. 즉 대기상태가 없다는 것이다. 매 프레임마다 함수가 실행되고 메세지 큐를 검사하고 메세지가 있든 없든 항상 1을 반환하는 것이다. 물론 매개변수로 주어진 MSG구조체에 메세지 정보를 저장해 준다.

 

bool bClose = true;
while(bClose)
{
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if(WM_QUIT == msg.message) //이렇게 WM_QUIT의 메세지가 발생할 때 while루프를 벗어나게 설정한다.

        {                                         //왜냐하면 PeekMessage()은 항상 1을 반환 하므로

            bClose = false;
         }
        else
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
         }
     }
}

http://blog.naver.com/mind8control/110044446694


[출처] GetMessage와 PeekMessage|작성자 mind8contro