Examinarea o coadă de mesaje

Ocazional, cererea trebuie să examineze conținutul de un fir mesaj coadă la în afara lui firul mesaj buclă. De exemplu, dacă o cerere fereastra procedură efectuează o operație de desenare lungi, poate doriți ca utilizatorul să poată întrerupe funcționarea. Dacă aplicația examinează periodic coada de mesaje în timpul func?ionării pentru mesaje mouse-ul și tastatura, nu va răspunde de utilizator de intrare până la finalizarea opera?iunii. Motivul pentru aceasta este că funcția DispatchMessage în thread mesaj bucla nu se întoarce până când procedura fereastra se termină procesarea unui mesaj.

Utilizați funcția PeekMessage pentru a examina o coadă de mesaj în timpul unei opera?iuni de lungă durată. PeekMessage este similar cu funcția GetMessage ; atât o coadă de mesaje pentru un mesaj care corespunde criteriile de filtrare a verifica și apoi copiați mesajul la o structură MSG . Principala diferență între două funcții este că GetMessage nu se întoarce până când un mesaj potrivire criteriile de filtrare este plasate în coada de așteptare, întrucât PeekMessage returnează imediat indiferent de dacă un mesaj este în coada de așteptare.

Următorul exemplu arată cum se utilizează PeekMessage pentru a examina o coadă de mesaje pentru clicuri de mouse ?i tastatură intrare în timpul unei opera?iuni de lungă durată.

HWND hwnd; 
BOOL fDone; 
MSG msg; 
 
/ / Începe operația ?i continua până când acesta este complet / / sau până când utilizatorul face clic pe mouse-ul sau apasă o tastă. 
 
fDone = F&ALSE; 
în timp ce (! fDone) {fDone = DoLengthyOperation(); / / definite de cerere funcție / / elimina orice mesaje care pot fi în coada de așteptare. Dacă / coada con?ine orice mouse sau tastatură / / mesaje, încheierea opera?iunii. 
 
    în timp ce (PeekMessage (amp; msg, hwnd, 0, 0, PM_REMOVE)) {switch(msg.message) {caz WM_LBUTTONDOWN: caz WM_RBUTTONDOWN: caz WM_KEYDOWN: / / / / efectua orice Curățire necesare. 
                / / fDone = TRUE; 
        } 
    } 
} 

 

Alte funcții, inclusiv GetQueueStatus și GetInputState, de asemenea, vă permite să examinați conținutul de un fir mesaj coada. GetQueueStatus întoarce o matrice de steaguri care indică tipurile de mesaje în coada de așteptare; folosind-o este cea mai rapidă cale de a descoperi dacă coada conține mesaje. GetInputState întoarce TRUE dacă coada conține mesaje mausul sau tastatura. Ambele din aceste funcții pot fi utilizate pentru a determina dacă coada conține mesajele care trebuie să fie prelucrate.

Index