Berichten in de wachtrij

Het systeem kan een willekeurig aantal windows op een tijdstip weergegeven. Het systeem gebruikt voor het routeren van muis- en toetsenbordinvoer naar het juiste venster, berichtenwachtrijen.

het systeem houdt een berichtenwachtrij één systeem en een willekeurig aantal draad berichtenwachtrijen, één voor elke thread GUI. Om te voorkomen dat de overhead van een berichtenwachtrij voor niet-GUI threads maken, zijn alle discussies aanvankelijk gemaakt zonder een berichtenwachtrij. Het systeem creëert van een thread berichtenwachtrij alleen wanneer de draad haar eerste oproep voor een van de functies van Win32 gebruiker of GDI maakt.

Wanneer de gebruiker de muis verplaatst, klikt op de muisknoppen of typen op het toetsenbord, het stuurprogramma voor de muis of toetsenbord zet de input in berichten en plaatst ze in de systeem-berichtenwachtrij. Het systeem worden de berichten, een voor een, van de berichtenwachtrij systeem verwijderd, onderzoekt ze om te bepalen het doelvenster en posten ze vervolgens naar de berichtenwachtrij van de draad die het doelvenster gemaakt. Van een thread berichtenwachtrij ontvangt alle berichten van muis en toetsenbord voor de Vensters die zijn gemaakt door de draad. De draad worden berichten verwijderd uit de wachtrij en stuurt het systeem te sturen naar de juiste venster procedure voor de verwerking.

Met uitzondering van de WM_PAINT -bericht, het systeem altijd berichten aan het einde van een berichtenwachtrij. Dit zorgt ervoor dat een venster in de juiste first-in, first-out (FIFO) volgorde zijn Invoerberichten ontvangt. Het bericht WM_PAINT echter wordt bewaard in de wachtrij en wordt doorgestuurd naar de venster procedure alleen wanneer de wachtrij geen andere berichten bevat. Meerdere WM_PAINT-berichten voor hetzelfde venster worden gecombineerd tot een enkel bericht WM_PAINT, consolideren alle ongeldige delen van het clientgebied in een gemeenschappelijke ruimte. Combineren WM_PAINT-berichten vermindert het aantal keren dat een venster moet de inhoud van haar clientgebied vernieuwen.

Het systeem berichten een bericht van een thread berichtenwachtrij van vullen een MSG -structuur en het vervolgens te kopiëren naar de berichtenwachtrij. Informatie in MSG omvat: de greep van het venster waarvoor het bericht is bestemd, de bericht-id, de twee parameters van het bericht, de tijd het bericht is gepost, en de muis cursorpositie. Een draad kan een bericht naar zijn eigen berichtenwachtrij of naar de wachtrij van een andere thread met behulp van de functie PostMessage of PostThreadMessage.

Een toepassing kan een bericht uit de wachtrij verwijderen met behulp van de functie GetMessage . Te onderzoeken een bericht zonder het te verwijderen uit de wachtrij, kan een toepassing de PeekMessage functie. Deze functie wordt MSG gevuld met informatie over het bericht.

Na het verwijderen van een bericht uit de wachtrij, kan een toepassing de functie DispatchMessage om direct het systeem het bericht verzenden naar een venster procedure voor verwerking. DispatchMessage neemt een pointer naar MSG die door een eerdere aanroep van de functie GetMessage of PeekMessage was gevuld. DispatchMessage geeft de vensteringang, de bericht-id, en de twee parameters bericht aan de procedure venster, maar niet de tijd die het bericht is gepost of muis cursorpositie. Een toepassing kan deze informatie ophalen door de GetMessageTime en GetMessagePos functies aanroepen tijdens de verwerking van een bericht.

Een thread kunt de WaitMessage functie controle aan andere threads opleveren als er geen berichten in de berichtenwachtrij. De functie onderbreekt de draad en geeft geen resultaat totdat een nieuw bericht is geplaatst in de berichtenwachtrij van de thread.

U kunt de SetMessageExtraInfo functie aanroepen om te koppelen aan een 32-bits waarde van de huidige thread berichtenwachtrij. Vervolgens roept de functie GetMessageExtraInfo om de waarde die hoort bij het laatste bericht ontvangen door de functie GetMessage of PeekMessage.

Index