PeekMessage()와 GetMessage() 함수는 Windows 시스템 메시지 큐에서 메시지를 가져오는 함수이며, 동일한 4개의 매개변수를 갖는다.
BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
- lpMsg: MSG 구조체에 대한 포인터로, 함수 호출 이후 메시지 정보가 채워진다.
- hWnd: 메시지를 확인할 창 또는 윈도우 핸들. 일반적으로 nullptr로 설정하면 어떤 윈도우에서든 해당 메시지를 확인한다.
- wMsgFilterMin: 확인할 메시지 범위의 최소 값으로 WinUser.h에 정의되어 있다.
- wMsgFilterMax: 확인할 메시지 범위의 최대 값으로 WinUser.h에 정의되어 있다.
- wRemoveMsg: 메시지를 확인한 후 메시지 큐에서 제거할지 여부를 나타낸다.
- PM_NOREMOVE: 메시지를 큐에서 제거하지 않는다.
- PM_REMOVE: 메시지를 큐에서 제거한다.
- PM_NOYIELD: 메시지를 확인하고 다른 스레드에 CPU를 양보하지 않고 진행한다.
- BOOL 리턴값 : 메시지 큐에서 메시지를 확인되면 해당 메시지를 lpMsg에 채우고 TRUE를 반환한다, 큐에서 메시지 확인에 실패하면 FALSE를 반환한다.
GetMessage()와 PeekMessage의 차이
GetMessage() 는 시스템 메시지 큐가 비어있는 경우 메시지가 들어올 때까지 무한 대기하지만, PeekMessage() 는 바로 리턴해 메시지를 처리하지 않는 시간에 다른작업을 처리하도록 할 수 있다.
일반적인 윈도우 프로그램이라면 메시지 루프에 GetMessage()를 사용하여 메시지 큐가 비어있는 동안 유휴상태에 들어가 다른 프로세스가 CPU자원을 사용할 수 있도록한다. 하지만 게임 프로그램 같은 경우 메시지가 발생하지 않더라도 렌더링 등의 작업을 계속 처리해줘야 하므로 애플리케이션의 CPU점유율이 높아질 것을 감안하고 메시지루프에 PeekMessage()를 사용하기도 한다.
PeekMessage()를 사용하는 메시지루프 예시
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// background process
}
}
참고할만한 글
HOWTO: How to Use PeekMessage() Correctly in Windows
https://jeffpar.github.io/kbarchive/kb/074/Q74042/
'프로그래밍 > MFC (C++)' 카테고리의 다른 글
MFC ] 정적 라이브러리에서 MFC 사용 (0) | 2023.12.15 |
---|---|
MFC ] 컨트롤 색상 변경하기 (0) | 2023.12.14 |
Win32 API ] 메시지 루프 (0) | 2023.11.13 |
MFC ] 특정 컨트롤에 포커스 설정하기 (0) | 2023.11.06 |
시스템 종료와 관련된 윈도우 메시지 WM_QUERYENDSESSION, WM_ENDSESSION (0) | 2023.11.02 |