메시지 루프

각 이러한 세 가지 기능에 대 한 함수 호출의 간단한 메시지 루프 구성: GetMessage, TranslateMessage DispatchMessage.

MSG 메시지;

(GetMessage (amp; msg, NULL, 0, 0)) 동안
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

GetMessage 함수는 큐에서 메시지를 검색 하 고 메시지형식의 구조에 복사 합니다. 발생 WM_QUIT 메시지의 경우 FALSE를 반환 하는 경우가 아니면 0이 아닌 값을 반환 하 고 루프를 종료 합니다. 단일 스레드 응용 프로그램에서 메시지 루프 끝은 종종 응용 프로그램을 종료 하는 첫 번째 단계입니다. 응용 프로그램은 일반적으로 응용 프로그램의 메인 윈도우의 창 프로시저에서 WM_DESTROY 메시지에 대 한 응답에서 PostQuitMessage 함수를 사용 하 여 자체 루프를 끝낼 수 있습니다.

GetMessage의 두 번째 매개 변수로 창 핸들을 지정 하는 경우 지정 된 창에 대 한 메시지만 큐에서 검색 됩니다. GetMessage 수 또한 큐에 있는 메시지 필터링 지정된 된 범위 내에 속하는 메시지를 검색 합니다. 메시지 필터링에 대 한 자세한 내용은 메시지 필터링 을 참조 하십시오.

키보드에서 문자 입력을 수신 하는 스레드가 경우 스레드의 메시지 루프 TranslateMessage 을 포함 해야 합니다. 시스템은 사용자가 키를 누를 때마다 가상 키 메시지 (WM_KEYDOWNWM_KEYUP)를 생성 합니다. 가상 키 메시지는 가상 키 코드를 식별 하는 키를 눌렀을, 하지만 해당 문자 값을 포함 합니다. 이 값을 검색 하려면 메시지 루프 TranslateMessage, 문자 메시지 (WM_CHAR)로 가상 키 메시지를 변환 하 고 응용 프로그램이 메시지 큐에 다시 배치 하는 있어야 합니다. 문자 메시지 수 있습니다 다음 메시지 루프의 후속 반복 시 제거 될 및 창 프로시저에 전달.

DispatchMessage 함수 MSG 구조체에 지정 된 창 핸들을 연관 창 프로시저에 메시지를 보냅니다. 창 핸들 HWND_TOPMOST 이면 DispatchMessage 시스템에서 모든 최상위 창에 대 한 창 프로시저를 메시지를 보냅니다. 창 핸들이 NULL 이면 DispatchMessage 메시지와 함께 아무것도 하지 않는다.

응용 프로그램의 주 스레드는 응용 프로그램을 초기화 하 고 하나 이상의 창을 만든 후 메시지 루프를 시작 합니다. 시작 되 면 메시지 루프는 스레드의 메시지 큐에서 메시지를 검색 하 고 적절 한 windows 디스패치 계속 합니다. 메시지 루프 종료 GetMessage 함수는 메시지 큐에서 WM_QUIT 메시지를 제거 하는 경우.

응용 프로그램에 많은 창을 포함 하는 경우에 메시지 큐에 대 한 단 하나의 메시지 루프가 필요 합니다. DispatchMessage 항상 디스패치 메시지를 적절 한 창; 이 때문에 각 메시지 큐에는 메시지가 속한 창의 핸들을 포함 하는 MSG 구조.

다양 한 방법으로 메시지 루프를 수정할 수 있습니다. 예를 들어, 창으로 발송 하지 않고 큐에서 메시지를 검색할 수 있습니다. 이 창을 지정 하지 않으면 메시지를 게시 하는 응용 프로그램에 유용 합니다. 당신은 또한 직접 GetMessage 특정 메시지를 검색 하려면 큐에 다른 메시지를 남기는. 메시지 큐의 평소 FIFO 순서를 일시적으로 무시할 해야 하는 경우에 유용.

액셀러레이터 키를 사용 하는 응용 프로그램은 키보드 메시지 명령 메시지를 변환할 수 있어야 합니다. 이렇게 하려면 응용 프로그램의 메시지 루프 TranslateAccelerator 함수 호출을 포함 해야 합니다. 액셀러레이터 키에 대 한 자세한 내용은 다음 웹 사이트를 참조 하십시오. 키보드 액셀러레이터.

메시지 루프 대화 상자 키보드 입력을 받을 수 있도록 IsDialogMessage 함수를 포함 해야 합니다 스레드 모덜리스 대화 상자를 사용 하는 경우.

 

Index