메시지 큐 검사

때때로, 응용 프로그램에서 스레드의 메시지 루프 외부에서 스레드 메시지 큐의 내용을 검사 해야 합니다. 예를 들어, 응용 프로그램의 창 프로시저 긴 그리기 작업을 수행 하는 경우 사용자가 작업을 인터럽트 수를 할 수 있습니다. 응용 프로그램 마우스 및 키보드 메시지에 대해 작업 하는 동안 메시지 큐를 주기적으로 검사, 하지 않는 한 사용자는 작업이 완료 된 후 때까지 입력에 응답 하지 않습니다. 이 대 한 이유는 창 프로시저에서 메시지를 처리 완료 될 때까지 스레드의 메시지 루프에서 DispatchMessage 함수 반환 하지 않습니다.

PeekMessage 함수를 사용 하 여 긴 작업을 하는 동안 메시지 큐 검사 수 있습니다. GetMessage 함수; PeekMessage 비슷합니다. 두 필터 기준과 일치 하는 메시지에 대 한 메시지 큐를 확인 하 고 메시지 구조에 메시지를 복사. 두 함수 사이의 주요 차이점은 그 GetMessage 반환 하지 않는 필터 조건과 일치 하는 메시지 큐에 배치 될 때까지 PeekMessage 메시지 큐에 여부에 관계 없이 즉시 반환 하는 반면.

다음 예제에서는 PeekMessage 사용 하 여 시간이 오래 걸리는 작업 하는 동안 마우스 클릭과 키보드 입력에 대 한 메시지 큐를 검사 하는 방법을 보여 줍니다.

HWND hwnd; 
BOOL fDone; 
MSG 메시지; 
 
/ / 작업을 시작 하 고 완료 될 때까지 계속 / / 또는 사용자 마우스 클릭 또는 키를 누를 때까지. 
 
fDone = F&ALSE; 
동안 (! fDone) {fDone = DoLengthyOperation(); / / 응용 프로그램 정의 함수 / / 큐에 있을 수 있는 모든 메시지를 제거 합니다. 경우 해당 / 모든 마우스 또는 키보드를 포함 하는 큐 / / / 메시지 작업 끝. 
 
    (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) 동안 {switch(msg.message) {WM_LBUTTONDOWN 경우: WM_RBUTTONDOWN 경우: WM_KEYDOWN 사례: / / / / 필요한 정리를 수행 합니다. 
                / / fDone = TRUE; 
        } 
    } 
} 
 

GetInputState, GetQueueStatus 등의 다른 함수를 사용 하면 스레드 메시지 큐의 내용을 검사할 수 있습니다. GetQueueStatus ; 큐에 있는 메시지의 종류를 나타내는 플래그의 배열을 반환합니다 그것을 사용 하 여 메시지 큐에 포함 되어 있는지 여부를 발견 하는 가장 빠른 방법입니다. GetInputState 큐 마우스 또는 키보드 메시지를 포함 하는 경우 TRUE를 반환 합니다. 이러한 함수 중 두 큐에 메시지를 처리 하는 데 필요한이 포함 되어 있는지 여부를 확인 하는.

 

Index