GetMessage

원형 BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
MFC 원형 해당 함수 없음
인수

▶lpMsg : 메시지를 받을 구조체이며 다음과 같이 선언되어 있다.

typedef struct tagMSG {     // msg 
    HWND   hwnd;     
    UINT   message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD  time; 
    POINT  pt; 
} MSG; 

▶hWnd : 메시지를 받을 윈도우이며 이 윈도우로 보내지는 메시지를 조사한다. 이 인수가 NULL이면 이 함수를 호출한 스레드로 전달된 모든 메시지를 조사한다.

▶wMsgFilterMin : 조사할 메시지의 최소값.

▶wMsgFilterMax : 조사할 메시지의 최대값. 이 두 인수를 사용하면 일정한 범위에 속한 메시지만 조사할 수 있는데 이를 메시지 필터링이라고 한다. 예를 들어 키보드 관련 메시지만 조사하고 싶으면 WM_KEYFIRST, WM_KEYLAST로 범위를 지정할 수 있다. 두 인수가 모두 0이면 메시지 필터링을 하지 않으며 모든 메시지를 조사한다.

리턴

조사한 메시지가 WM_QUIT 메시지이면 FALSE를 리턴하며 그 외의 메시지이면 TRUE를 리턴한다. 이 리턴값은 메시지 루프를 탈출하기 위한 용도로 사용되는데 WM_QUIT 메시지가 전달되었으면 메시지 루프가 종료된다. 에러 발생시 -1이 리턴된다.

설명

호출한 스레드에서 메시지를 꺼내 첫번째 인수로 전달된 lpMsg구조체에 채워준다. 특정 윈도우(그 차일드도 포함된다)로 보내지는 메시지나 PostThreadMessage 함수에 의해 스레드로 보내진 메시지를 조사할 수 있으며 특정한 범위에 있는 메시지만 조사할 수도 있다. 이 함수는 다른 스레드나 다른 프로세스의 메시지는 조사하지 못하며 오직 호출 스레드의 메시지만 조사할 수 있다. 다음은 전형적인 메시지 루프의 예이다.

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

전체 루프는 while문으로 싸여져 있어 GetMessage가 WM_QUIT를 조사할 때까지 반복된다. GetMessage는 이 스레드에 속한 모든 윈도우에 대해 모든 메시지를 조사하여 Message구조체에 채워준다. 이 메시지는 DispatchMessage 함수에 의해 해당 윈도우의 윈도우 프로시저로 보내진다.

GetMessage 함수는 스레드 메시지 큐에서 메시지를 읽은 후 이 메시지를 큐에서 제거한다. 단 예외적으로 WM_PAINT 메시지는 이 메시지가 처리된 후에 메시지 큐에서 제거된다.

GetMessage 함수는 메시지 큐에 대기중인 메시지가 없을 경우 메시지가 전달될 때까지 무한히 대기한다.

참고함수 PeekMessage
플렛폼 95이상
참조  

written by http://www.winapi.co.kr