Windows 메시지
윈도우 메시지는 키보드, 마우스와 같이 윈도우 상의 여러 응용 프로그램들에 의해 공유되는 입력장치로부터 발생하는 키보드 눌림, 마우스 이동과 같은 이벤트를 알리는 용도로 사용되기도 하며 윈도우의 생성/제거, 크기변화, 이동 등에 대한 통지의 용도등 매우 다양하다. 윈도우 메시지는 Win32 API에 정의된 MSG구조체(Structure)로 정의되어 있다.
메시지 펌프 & 윈도우 프로시저
수신된 윈도우 메시지는 메시지 큐에 삽입된다. 메시지 큐에 삽입된 윈도우 메시지는 어플리케이션에 의해 메시지 큐에서 꺼내 처리된다. 이때 어플리케이션은 큐에서 꺼낸 해당 메시지를 처리할 윈도우 프로시저를 호출하는 과정을 거쳐야 한다. 이 과정은 대개 while문을 통해 루프를 돌면서 어플리케이션이 종료될때까지 메시지를 꺼내어 처리하도록 하기 때문에 이 과정을 메시지 루프 혹은 메시지 펌프라고 한다.
윈도우 프로시저는 각 윈도우 종류(window class)마다 하나씩 지정된 함수이며, 메시지 큐에서 꺼내진 메시지가 실제로 처리되는 함수이다. 예를 들면
1. 사용자가 버튼을 클릭하면 마우스 버튼이 눌러졌다는 윈도우 메시지가 발생
2. 1.에서 발생한 메시지는 메시지 큐에 삽입
3. 메시지 펌프를 통해 윈도우 프로시저에 전달
4. 윈도우 프로시저는 마우스 버튼이 눌려졌음을 알리는 윈도우 메시지를 처리하여 버튼이 클릭된 효과를 나타내고 버튼 클릭에 대한 응용 프로그램 이벤트 핸들러를 호출
요약하면.. 실제적인 윈도우 메시지에 대한 처리는 윈도우 프로시저에 의해서 처리되며 윈도우 프로시저가 호출되기 위해서는 메시지 펌프가 메시지 큐에 삽입된 윈도우 메시지를 윈도우 프로시저로 전달하는 과정이 필요하다는 것이다.
메시지 큐에 쌓여있는 윈도우 메시지가 메시지 펌프에 의해 꺼내지고 윈도우 프로시저에 전달되어 메시지들이 처리되어야만 UI가 작동한다. 만약 메시지 펌프가 작동하지 않는다면 키보드 입력, 윈도우의 크기변경 등의 사용자 액션에 대한 윈도우 메시지들은 메시지 큐에 쌓이기만 하고, 처리가 되지 않아 결과를 확인할수 없을것이다.
Post Message vs Send Message
윈도우 메시지는 사용자 액션에 의해서만 발생하는 것은 아니라, 프로그램 구성 요소들이 서로 통신을 하는 데도 사용된다. 예를 들어 텍스트 박스에 어떤 텍스트(문자열)을 설정하고자 한다면 텍스트 박스에 문자열 설정을 지시하는 윈도우 메시지를 전송해야 한다. 비슷하게 리스트 박스에 리스트 아이템을 추가하기 위해서도 리스트 박스에 윈도우 메시지를 전송해야 한다.
이처럼 특정 윈도우에 어떤 작업을 지시하기 위한 윈도우 메시지는 마우스나 키보드에 의한 메시지보다 빠른 응답 시간을 요구하기 때문에 메시지 큐를 사용하지 않고 직접 윈도우 프로시저로 메시지가 전달된다.
Post Message : 메시지 큐를 통해 메시지를 전송하는 것
Send Message : 메시지 큐를 사용하지 않고 메시지를 전송하는 것