Meldingsløkke

En enkel meldingsløkke består av én funksjonskall til hver av disse tre funksjoner: GetMessage, TranslateMessageog DispatchMessage.

MSG msg;

mens (GetMessage (amp; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

GetMessage -funksjonen henter en melding fra køen, og kopierer den til en struktur av typen MSG. Den returnerer en ikke-null verdi, med mindre det finner WM_QUIT meldingen, i så fall opprettes det returnerer USANN og ender løkken. I en enkelttrådet program er slutter meldingsløkke ofte det første trinnet i å lukke programmet. Et program som kan avslutte sin egen løkke ved hjelp av funksjonen for PostQuitMessage , vanligvis i WM_DESTROY vises i vinduet prosedyren av programmets hovedvindu.

Hvis du angir en vindusreferanse som den andre parameteren av GetMessage, er bare meldinger for det angitte vinduet Hentet fra køen. GetMessage kan også filtrere meldinger i køen, hente meldinger som faller innenfor et angitt område. Hvis du vil ha mer informasjon om filtrering meldinger, kan du se Meldingsfiltrering.

En tråd meldingsløkke må inkludere TranslateMessage hvis tråden er å motta Tegninndata fra tastaturet. Systemet genererer virtual-key-meldinger (WM_KEYDOWN og WM_KEYUP) hver gang brukeren trykker en tast. En virtual-key-melding inneholder en virtual-key-kode som identifiserer hvilken tast ble trykket, men ikke sin tegnverdien. Hvis du vil hente denne verdien, må løkken meldingen inneholde TranslateMessage, som oversetter virtual-key-melding til en melding med tegn (WM_CHAR) og plasserer det tilbake i meldingskøen program. Tegnet meldingen kan deretter fjernet på en påfølgende gjentakelse av løkken melding og sendt til en vindusprosedyre.

Funksjonen DispatchMessage sender en melding i vinduet prosedyren tilknyttet vindusreferansen angitt i MSG -strukturen. Hvis vindusreferansen er HWND_TOPMOST, sender DispatchMessage meldingen til vinduet prosedyrene for alle vinduer på øverste nivå i systemet. Hvis vindusreferansen er NULL, gjør DispatchMessage ingenting med meldingen.

Et programs hovedtråden starter sin meldingsløkke etter initialisering av programmet og opprette minst ett vindu. Når startet, fortsetter meldingen løkken å hente meldinger fra meldingskøen trådens og å sende dem til riktige windows. Meldingen løkken avsluttes når GetMessage -funksjonen WM_QUIT meldingen fjernes fra meldingskøen.

Bare én meldingsløkke er nødvendig for en meldingskø, selv om et program inneholder mange vinduer. DispatchMessage samtalelogger alltid meldingen til vinduet riktig; Dette er fordi hver melding i køen er en MSG -struktur som inneholder håndtak i vinduet som meldingen tilhører.

Du kan endre en meldingsløkke på en rekke måter. Du kan for eksempel hente meldinger fra køen uten å sende dem i et vindu. Dette er nyttig for programmer som legge inn meldinger som ikke angir et vindu. Du kan også direkte GetMessage til å søke etter bestemte meldinger, forlater andre meldinger i køen. Dette er nyttig hvis du må midlertidig omkjøringsvei vanlige FIFO rekkefølgen på meldingskøen.

Et program som bruker hurtigtastene må kunne oversette tastaturet meldinger til kommandomeldinger. Hvis du vil gjøre dette, må meldingsløkker i programmets inkluderer et kall til funksjonen TranslateAccelerator . Hvis du vil ha mer informasjon om hurtigtastene, kan du se Tastatur gasspedalene.

Hvis en tråd bruker en ikke-sperrende dialogboks, må meldingsløkke inkludere funksjonen IsDialogMessage slik at dialogboksen kan motta inndata fra tastaturet.

Index