WInApi

WinAPI GetMessage와 PeekMessage 차이

5_솔방울 2022. 11. 10.

WinApi의 메시지 루프에 사용되는 함수 중, 메시지 큐에서 메시지를 받아와 처리하는 역할을 하는 GetMessage()라는

함수가 있다. 그러나 (특히 게임에선) 메시지가 들어오지 않더라도 지속적으로 동작이 되어야 하는 경우가 많다.

(캐릭터가 가만히 있는 동안의 애니메이션 같은 경우)

 

그렇기에 PeekMessage()를 사용하는데, PeekMessage는 메시지가 들어오지 않더라도 동작을 처리할 수 있어 용이하다.

최대한 쉽게 설명했다...

GetMessage 코드

while (GetMessage(&msg, nullptr, 0, 0)) //메시지가 없으면 계속 기다린다...
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

GetMessage 코드

	while (true)
	{
		if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
		{
			if (WM_QUIT == msg.message) //따로 예외처리를 해줘야한다.
				break;
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
		else
		{
			//메시지가 없을 때 실행할 일
		}
	}

유의할 점이 있다면 WM_QUIT로 입력이 들어왔을 때 따로 예외처리를 해줘야 정상적으로 동작한다는 것이다.

(GetMessage는 함수 처리 과정에서 예외처리를 해줌)

댓글