Mesaj bucla

Un mesaj simplu bucla constă dintr-o funcție de apel la fiecare dintre aceste trei func?ii: GetMessage, TranslateMessageși DispatchMessage.

MSG msg;

în timp ce (GetMessage (amp; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

Funcția GetMessage preia un mesaj din coada de așteptare și îl copiază la o structură de tip MSG. Aceasta returnează o valoare nenul, cu excepția cazului în întâlnește mesaj WM_QUIT , în care caz se întoarce FALSE și se termină bucla. Într-o aplicație single-threaded, care se încheie la bucla de mesaj este de multe ori primul pas în aplicarea de închidere. Cererea poate scop propriu loop utilizând funcția de PostQuitMessage , de obicei ca răspuns la mesajul WM_DESTROY în procedura de fereastra din fereastra principală a aplicației.

Dacă specificați un mâner fereastra ca al doilea parametru al GetMessage, numai mesajele pentru fereastra specificate sunt preluate de la coada de așteptare. GetMessage , de asemenea, posibilitatea să filtrați mesaje în coada de așteptare, preluarea numai acele mesaje care intră într-un anumit interval. Pentru mai multe informații despre mesajele de filtrare, consultați Filtrarea de mesaj.

Un fir mesaj bucla trebuie să includă TranslateMessage dacă firul este să primească caracterul de intrare de la tastatură. Sistemul generează mesaje de virtual-cheie (WM_KEYDOWN ?i WM_KEYUP) de fiecare dată presele de utilizator o cheie. Un mesaj virtual-cheie conține un cod de virtual-cheie care identifică care a fost tasta, dar nu sa valoare de caractere. Pentru a prelua această valoare, bucla mesajul trebuie să con?ină TranslateMessage, care se traduce mesajul virtual-cheie într-un mesaj de caractere (WM_CHAR) și îl plasează înapoi în coada de așteptare mesaj cerere. Apoi mesajul de caractere pot fi eliminate la o repetare ulterioară de bucla mesaj și expediate la o procedură de fereastra.

Funcția DispatchMessage a trimite un mesaj la procedura fereastra asociate cu mâner fereastra specificate în structura MSG . Dacă fereastra Handle-ul este HWND_TOPMOST, DispatchMessage trimite mesajul la procedurile de fereastra din toate ferestrele de Internet de nivel superior în sistem. Dacă fereastra Handle-ul este NULL, DispatchMessage nu face nimic cu mesajul.

O cerere firul principal începe sa bucla mesaj după inițializarea aplicarea și crearea de cel pu?in o fereastră. Odată ce a început, bucla mesaj continuă pentru a prelua mesajele din coada lui firul de mesaj și trimiterea acestora la Ferestre corespunzătoare. Bucla de mesaj se termină atunci când funcția GetMessage elimină mesajul WM_QUIT din coada de mesaje.

Doar un singur mesaj bucla este necesar pentru o coadă de mesaj, chiar dacă cererea conține multe ferestre. DispatchMessage întotdeauna expedieri mesajul în fereastra corespunzătoare; Acest lucru este pentru că fiecare mesaj în coada de așteptare este o structură de mesaj care conține ghidajul din fereastra de care aparține mesajul.

Aveți posibilitatea să modificați o buclă de mesaj într-o varietate de moduri. De exemplu, regăsiți mesaje din coada de așteptare de fără expediere-le într-o fereastră. Acest lucru este util pentru aplicații care posta mesaje nu specifică o fereastră. Puteți, de asemenea, direct GetMessage pentru a căuta mesaje specifice, lăsând alte mesaje în coada de așteptare. Acest lucru este util dacă tu trebuie să ignorați temporar ordinea FIFO obicei coada de mesaje.

O aplicație care utilizează accelerator chei trebuie să fie capabil de a traduce tastatură mesajele în mesaje de comandă. Pentru a face acest lucru, aplicației mesaj bucla trebuie să includă un apel la funcția de TranslateAccelerator . Pentru mai multe informații despre accelerator chei, consultați Claviatură Accelerators.

Dacă un fir utilizează o casetă de dialog fără mod, bucla mesajul trebuie să includă funcția IsDialogMessage , astfel încât caseta de dialog poate primi input tastatură.

Index