Bericht lus

Een eenvoudige boodschap lus bestaat uit een functieaanroep aan elk van deze drie functies: GetMessage, TranslateMessageen DispatchMessage.

MSG msg;

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

De functie GetMessage een bericht uit de wachtrij opgehaald en gekopieerd naar een structuur van type MSG. Het geeft als resultaat een andere waarde dan nul, tenzij het tegenkomt het WM_QUIT bericht, in welk geval het geeft FALSE als resultaat en de lus eindigt. In een single thread-toepassing is die eindigde de lus bericht vaak de eerste stap in het sluiten van de toepassing. Een toepassing kan een eigen lus beëindigen met behulp van de functie PostQuitMessage , meestal in reactie op het bericht van de WM_DESTROY in de procedure venster van het hoofdvenster van de toepassing.

Als u een vensteringang als de tweede parameter van GetMessageopgeeft, worden alleen berichten voor het opgegeven venster opgehaald uit de wachtrij. GetMessage kunt ook het filteren van berichten in de wachtrij, ophalen van alleen die berichten die binnen een opgegeven bereik vallen. Zie voor meer informatie over het filteren van berichten, Bericht filteren.

Van een draad bericht lus moet opnemen TranslateMessage als de draad is karakter input van het toetsenbord ontvangen. Het systeem genereert virtuele-kernboodschappen (WM_KEYDOWN en WM_KEYUP) telkens wanneer die de gebruiker op een toets drukt. Een virtueel-sleutel bericht bevat een virtuele-sleutel code die welke toets werd ingedrukt aangeeft, maar niet de waarde van haar karakter. Deze waarde op te halen, moet de lus bericht TranslateMessage, die het virtuele-sleutel bericht vertaalt in een teken bericht (WM_CHAR) en plaatst het terug in de berichtenwachtrij van de toepassing bevatten. Het teken bericht kan vervolgens worden verwijderd op een volgende iteratie van de lus bericht en verzonden naar een venster procedure.

De functie DispatchMessage stuurt een bericht naar de venster procedure samen met de vensteringang opgegeven in de MSG -structuur. Als de vensteringang HWND_TOPMOST is, verzendt DispatchMessage het bericht naar de venster procedures van alle vensters op het hoogste niveau in het systeem. Als de vensteringang NULL is, de DispatchMessage doet niets met het bericht.

Een toepassing main thread begint haar bericht lus na het initialiseren van de toepassing en het maken van ten minste één venster. Eenmaal gestart, blijft de lus bericht berichten ophalen uit de berichtenwachtrij van de thread en op verzending hen naar de juiste windows. De bericht-lus eindigt wanneer de functie GetMessage het WM_QUIT bericht uit de berichtenwachtrij verwijdert.

Slechts één bericht lus is nodig voor een berichtenwachtrij, zelfs als een toepassing veel vensters bevat. DispatchMessage verzendt altijd het bericht naar het juiste venster; Dit is omdat elk bericht in de wachtrij is een MSG -structuur die bevat de ingang voor het venster waarnaar het bericht behoort.

U kunt een bericht lus in een verscheidenheid van manieren wijzigen. U kunt bijvoorbeeld berichten ophalen uit de wachtrij zonder hen te verzenden naar een venster. Dit is handig voor toepassingen die berichten niet opgeven van een venster. U kunt ook directe GetMessage om te zoeken naar bepaalde berichten, verlaten van andere berichten in de wachtrij. Dit is handig als u tijdelijk de gebruikelijke FIFO-volgorde van de berichtenwachtrij negeren moet.

Een toepassing die gebruikmaakt van sneltoetsen moeten kunnen berichten te vertalen toetsenbord in opdracht berichten. Om dit te doen, moet van de toepassing bericht lus omvatten een aanroep naar de functie TranslateAccelerator . Zie voor meer informatie over sneltoetsen, Sneltoetsen.

Als een draad een niet-modaal dialoogvenster gebruikt, moet de lus bericht de IsDialogMessage functie opnemen, zodat het dialoogvenster toetsenbordinvoer kan ontvangen.

Index