본문 바로가기

[ Windows Program ]/Windows API

[WinAPI] The Message Loop

이부분이 바로 메인 메시지 루프(Main message loop) 이다.

( 메시지 큐에서 메시지를 계속해서 꺼내는 반복문을 말한다. )

 

While문이 반복문이라는걸 다들 알고 있을 것이다.( C/C++ 컨텐츠 참고 )

While문에 0이 들어가면 반복이 끝나는데 저기서 GetMessage 라는 함수를 이용해서

말 그대로 메시지를 받아오는 역할을 한다.

 

아니 그럼 어디서 메시지를 받아온다는 말인가요?

 

메시지 큐(Message Queue)에서 메시지를 받아온다. 메시지 큐에 대한 내용은 다음 포스트에서 다루겠다.

 

그렇게 메시지를 받고 이 GetMessage() 함수가 0을 반환하면 반복이 끝난다는 뜻이다.

 

이런 작업은 운영체제 자체가 하는것이기에 그냥 동작원리만 이해하면 된다.

 

 

이벤트가 발생하면 (키보드나 마우스 입력했을때 ) 운영체제는 이것을 감지하고

메시지로 윈도우 응용 프로그램에 알려준다.

그래서 메시지 큐에 추가되고, 응용 프로그램은 자신의 메시지 큐에서 메시지를 하나씩

꺼내서 적절한 처리를 하는데 만약 응용 프로그램 종료하라는 함수가 발생하면

GetMessage() 함수가 0을 반환해서 메인 메시지 루프를 완료하고 응용 프로그램을 종료한다.

 

그다음으로 빨간색 동그라미 반복문 안에 보면

 

TranslateMessage() 함수와 DispatchMessage() 함수가 존재하는걸 확인해 볼 수 있는데

 

이 함수들도 GetMessage() 함수와 더불어 중요하다.

 

일단 TranslateMessage() 함수는

하는 일이 메시지가 WM_KEYDOWN인지와 눌러진 키가 문자키인지 검사하고

조건이 맞을 경우 WM_CHAR 메시지를 추가로 발생할때 사용되는 함수이고,

( WM_KEYDOWN 나 WM_CHAR는 메시지핸들러 함수인데 아직 몰라도 됨 )

 

DispatchMessage() 함수는

내부적으로 메시지 프로시저(WndProc) 함수를 호출한다.

 

메시지 프로시저 함수는 전달받은 메시지가 무엇인지 분석하고 적절한 처리를 수행한다.