Windows/Windows Programming

윈도우 메세지

MOLOKINI 2014. 11. 16. 16:26

윈도우 메세지

윈도우는 메세지 기반 구동 방식의 운영체제입니다.

윈도우 메세지는 마우스를 움직인다거나 키보드를 입력하는 등의 이벤트들이나 윈도우 크기 변화 색깔의 변화 등과 같은 시스템적 상태 변화에 의해 발생합니다.

윈도우 메세지가 발생하면 윈도우는 두 가지 방법으로 메세지를 전달합니다.

 

1. 각 어플리케이션 마다 가지고 있는 메세지 큐에 메세지를 추가하는 방법

 - 사용자 요구에 따른 키보드/마우스 이벤트 등

2. 빠른 처리를 위해 어플리케이션의 윈도우 프로시저에 직접 메세지를 전달하는 방법

 - 특정 윈도우에 어떠한 작업을 지시하기 위한 메세지

이 있습니다.

 

 

 

 

이벤트 발생 -> 시스템 메세지 큐 -> 응용 프로그램 메세지 큐 -> 메세지 루프 -> 윈도우 프로시저

이러한 처리 과정을 가지고 있습니다.

 

메세지 큐는 말 그대로 큐와 같이 FIFO(First-In First-Out)구조로 동작하며 임시로 메세지를 저장합니다. 어플리케이션의 메세지 큐에 저장된 메세지는 어플리케이션의 WinMain 함수에서 큐에 저장된 순서대로 처리됩니다.

- WinMain 함수는 지속적으로 큐를 검사해서 메세지가 있으면 적절한 윈도우에 메세지를 전달하고 그 메세지를 메세지 큐에서 삭제하며 메세지 큐에 WM_QUIT 메세지가 들어올 때까지 이런 작업을 반복합니다.

 

어플리케이션의 각 윈도우는 윈도우 프로시저를 가지고 있으며 이 프로시저의 역할은 메세지를 실제로 처리해주는 역할을 담당합니다.

- RegisterClass, RegisterClassEx API를 이용해 윈도우 클래스를 등록할 때 윈도우 프로시저를 등록하게 되어 있습니다.

- CreateWindowEx 등의 API로 등록한 윈도우 클래스의 인스턴스를 생성하면 그 윈도우의 메세지는 등록할 때 지정한 윈도우 프로시저에게 보내집니다.

 

 

PostMessage, SendMessage

윈도우 메세지는 사용자 액션에 의해서만 발생하는 것은 아닙니다.

프로그램 구성요소들이 서로 통신하는데에도 사용됩니다. 어떠한 특정 윈도우에 어떤 작업을 지시하기 위한 윈도우 메세지는 마우스나 키보드에 의한 메세지보다 빠른 응답 시간을 요구하기 때문에 메세지 큐를 이용하지 않고 직접 윈도우 프로시저로 메세지가 전달된다.

PostMessage : 메세지 큐를 통해 메세지를 전달하는 것

SendMessage : 메세지 큐를 사용하지 않고 메세지를 전송하는 것

- 둘 다 Windows API 함수

 

 

GetMessage, PeekMessage

둘 다 Windows API로 메세지를 받는 함수로 

GetMessage : 다음 메세지가 있을 때 까지 대기상태

PeekMessage : 큐에 메세지가 있으면 true, 없으면 false를 리턴합니다. 메세지가 있으면 그것을 처리하고 그렇지 않은 경우에는 이외의 작업을 실행합니다.

- 이 경우에는 메세지가 없는 경우 false를 리턴하는 점을 바탕으로 다른 작업을 수행하는 코드를 작성할 수 있습니다.

 

 

TranslateMessage()

Windows API 함수로

TranslateMessage는 GetMessage등으로 메세지를 받아온 내용이 WM_KEYDOWN을 발생(키보드를 누르는 메세지)시키면 어떠한 문자키를 눌렀는지 해석하여 WM_CHAR 메세지를 발생시킵니다. 이 때, 어떤 키보드를 눌렀는지의 정보도 함께 전달이 됩니다.

- 만약 a를 눌렀다면, WPARAM으로 해당 키 코드가 들어가게 됩니다.

- 문자 입력을 하지 않았다면 아무런 일을 하지 않습니다.

 

while(GetMessage(&Message,0,0,0)) {
	TranslateMessage(&Message);
	DispatchMessage(&Message);
}

 

- 이러한 형태로 쓰이게 됩니다.

- 현재 코드에서 TranslateMessage가 빠져버린다면 WM_CHAR를 해석하지 못해 키보드 메세지를 판별할 수 없게 됩니다.

 

 

DispatchMessage()

역시 Windows API 함수로

메세지 큐에서 꺼낸 메세지를 메세지 처리 함수(WinProc)로 전달하는 역할을 하는 함수입니다.