2008. 8. 11. 15:18

GetMessage() 와 PeekMessage()



Windows API 프로그래밍에서 GetMessage()PeekMessage() 는 메시지 루프에서 사용되는 API이다. 둘다 메시지 큐에서 메시지를 가져오는 역할을 하는데.. 두 API에 약간의 차이는 있다.

BOOL GetMessage ( LPMSG lpMsg,
                            HWND hWnd,
                            UINT wMsgFilterMin,
                            UINT wMsgFilterMax)
GetMessage() 는 메시지 루프... 스레드 메시지 큐에서 메시지를 읽은 후 읽은 메시지를 큐에서 제거한다.

BOOL PeekMessage ( LPMSG lpMsg,
                              HWND hWnd,
                              UINT wMsgFilterMin,
                              UINT wMsgFilterMax,
                              UINT wRemoveMsg)

PeekMessage() 는 GetMessage() 와 마찬가지로 메시지 큐에서 메시지를 읽는 다 메시지의 범위를 줄 수 있는 기능도 GetMessage() 와 동일하다. 하지만, PeekMessage() 는 GetMessage() 와는 달리 읽은 메시지를 무조건 저거하지 않으며 큐가 비어있을 경우 대기하지 않고 바로 리턴한다는 점이 다르다. 따라서 이 함수는 메시지를 읽지 않고 단순히 메시지가 있는지 확인만 할 수 있으며, 이런 특성은 백그라운드 작업에 적절하다.
PeekMessage() 의 마지막 인자를 PM_NOREMOVE로 지정을 하면 큐에서 메시지를 없애지 않고 내용을 볼 수 있다. PM_REMOVE로 지정을 하면 GetMessage() 처럼 큐에서 메시지를 없앤다.


간단히 말해 GetMessage() 함수는 큐에 메시지를 받을 때 까지 복귀하지 않고 루프를 돌면서 대기하는 상태이지만, PeekMessage() 함수는 큐에 메시지가 없는 경우에도 즉석에서 제어를 돌려주고, 다른 일을 할 수 있다는 것이다.


출처 : http://winapi.co.kr