Å undersøke en meldingskø

Et program krever av og til å undersøke innholdet i en tråd meldingskøen fra utenfor trådens meldingsløkke. For eksempel hvis et programs vindusprosedyre utfører en lengre tegneoperasjon, kan du brukeren å kunne avbryte operasjonen. Med mindre programmet undersøker meldingskøen med jevne mellomrom under operasjonen for musen og tastaturet meldinger, vil det ikke svare på brukerinndata før etter at operasjonen er fullført. Grunnen til dette er at funksjonen DispatchMessage i trådens meldingsløkke ikke tilbake til vinduet prosedyren er ferdig behandling av en melding.

Du kan bruke PeekMessage -funksjonen til å undersøke en meldingskø under en langvarig operasjon. PeekMessage ligner på GetMessage -funksjonen; både Kontroller en meldingskø for en melding som samsvarer med filtervilkårene, og kopier deretter meldingen til en MSG -struktur. Den største forskjellen mellom de to funksjonene er at GetMessage ikke returnerer før en melding som samsvarer med filtervilkårene i som er plassert i køen, mens PeekMessage returnerer umiddelbart uansett om en melding er i køen.

Eksemplet nedenfor viser hvordan du bruker PeekMessage til å undersøke en meldingskø for museklikk og tastaturinndata under en langvarig operasjon.

HWND hwnd; 
BOOL fDone; 
MSG msg; 
 
/ / Begynne defragmenteringen, og Fortsett til det er fullført / /, eller til brukeren klikker musen eller trykker en tast. 
 
fDone = F&ALSE; 
mens (! fDone) {fDone = DoLengthyOperation(); / / programdefinert funksjonen / / Fjern alle meldinger som kan være i køen. Hvis den / / køen inneholder mus eller tastatur / / meldinger, avslutte operasjonen. 
 
    mens (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: / / / / utføre eventuelle nødvendige opprydding. 
                / / fDone = TRUE; 
        } 
    } 
} 

 

Andre funksjoner, inkludert GetQueueStatus og GetInputState, kan du undersøke innholdet i en tråd meldingskøen. GetQueueStatus returnerer en matrise med flagg som angir hvilke typer meldinger i køen; bruker den, er den raskeste måten å oppdage om køen inneholder meldinger. GetInputState returnerer SANN hvis køen inneholder musen eller tastaturet meldinger. Begge disse funksjonene kan brukes til å finne ut om køen inneholder meldinger som må behandles.

Index