Esame di una coda di messaggi

In alcuni casi, un'applicazione deve esaminare il contenuto della coda dei messaggi di un thread all'esterno del ciclo di messaggi del thread. Ad esempio, se la routine della finestra di un'applicazione esegue un'operazione di disegno lunga, si consiglia all'utente di essere in grado di interrompere l'operazione. A meno che l'applicazione periodicamente esamina la coda dei messaggi durante l'operazione per i messaggi di mouse e tastiera, non risponderà all'utente di ingresso fino al termine dell'operazione. La ragione di questo è che la funzione DispatchMessage nel ciclo di messaggi del thread non viene restituito finché la routine della finestra termina l'elaborazione di un messaggio.

È possibile utilizzare la funzione PeekMessage per esaminare una coda di messaggi durante un'operazione di lunga durata. PeekMessage è simile alla funzione GetMessage ; sia controllare una coda di messaggi per un messaggio che corrisponde ai criteri di filtro e quindi copiare il messaggio di una struttura MSG . La differenza principale tra le due funzioni è che GetMessage non viene restituito finché un messaggio corrispondenti ai criteri di filtro viene inserito nella coda, mentre PeekMessage restituisce immediatamente indipendentemente sia un messaggio nella coda.

Nell'esempio seguente viene illustrato come utilizzare PeekMessage per esaminare una coda di messaggi per clic del mouse e input da tastiera durante un'operazione di lunga durata.

HWND hwnd; 
BOOL fDone; 
MSG msg; 
 
/ / Iniziare l'operazione e continuare fino al completamento / / o fino a quando l'utente fa clic del mouse o si preme un tasto. 
 
fDone = F&ALSE; 
mentre (! fDone) {fDone = DoLengthyOperation(); / / definiti dall'applicazione funzione / / Rimuovi eventuali messaggi che possono essere nella coda. Se il / / coda contiene qualsiasi mouse o tastiera / / messaggi, terminare l'operazione. 
 
    mentre (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {caso WM_LBUTTONDOWN: caso WM_RBUTTONDOWN: caso WM_KEYDOWN: / / / / eseguire le necessarie operazioni di pulitura. 
                / / fDone = TRUE; 
        } 
    } 
} 
 

Altre funzioni, tra cui GetQueueStatus e GetInputState, consentono anche di esaminare il contenuto della coda dei messaggi di un thread. GetQueueStatus restituisce una matrice di flag che indica i tipi di messaggi nella coda; utilizzarlo è il modo più veloce per scoprire se la coda contiene messaggi. GetInputState restituisce TRUE se la coda contiene messaggi del mouse o della tastiera. Entrambe le funzioni può essere utilizzati per determinare se la coda contiene messaggi che devono essere elaborati.

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index