Nachrichten in der Warteschlange

Das System kann eine beliebige Anzahl von Windows gleichzeitig anzeigen. Wenn Sie Maus und Tastatur-Eingaben zu dem entsprechenden Fenster weiterleiten möchten, verwendet das System die Nachrichtenwarteschlangen.

das System verwaltet eine Meldungswarteschlange Einzelsystem und einer beliebigen Anzahl von Thread Message Queues, eine für jedes GUI-Thread. Um den Aufwand für das Erstellen einer Warteschlange für nicht-GUI-Threads zu vermeiden, werden alle Threads zunächst ohne eine Meldungswarteschlange erstellt. Das System erzeugt eine Thread-Nachrichtenwarteschlange nur, wenn der Thread der erste Aufruf einer Win32 Benutzer oder GDI Funktionen macht.

Wenn der Benutzer die Maus bewegt, die Maustasten klickt oder Typen auf der Tastatur, den Gerätetreiber für die Maus oder Tastatur die Eingabe in Nachrichten konvertiert und speichert sie in der Systemwarteschlange. Das System entfernt die Nachrichten, ein zu einer Zeit, aus der Meldungswarteschlange System, untersucht, um zu bestimmen das Zielfenster, und stellen sie dann an die Nachrichtenwarteschlange des Threads, die das Zielfenster erstellt. Meldungswarteschlange eines Threads empfängt alle Nachrichten für Maus und Tastatur für die Fenster durch den Thread erstellt. Der Thread werden die Nachrichten aus der Warteschlange entfernt und weist das System sie an die entsprechenden Fensterprozedur für die Verarbeitung senden.

Mit Ausnahme von den WM_PAINT -Meldung, Bucht das System immer Nachrichten am Ende einer Nachrichtenwarteschlange. Dadurch wird sichergestellt, dass ein Fenster seine Eingabemeldungen in die richtige First-in First-Out (FIFO) Reihenfolge erhält. Die WM_PAINT-Meldung, jedoch bleibt in der Warteschlange und wird an die Fensterprozedur nur, wenn die Warteschlange keine weiteren Nachrichten enthält. Mehrere WM_PAINT-Meldungen für das gleiche Fenster werden in einer einzelnen Nachricht WM_PAINT, konsolidieren alle ungültigen Teile des Clientbereichs in einem einzigen Gebiet zusammengefasst. Das Kombinieren der WM_PAINT-Meldungen reduziert die Anzahl der Mal, die ein Fenster der Inhalt des Clientbereichs neu zeichnen muss.

Das System Bucht eine Meldung in der Meldungswarteschlange eines Threads durch das Ausfüllen einer MSG -Struktur und kopieren es dann an die Nachrichtenwarteschlange. Informationen im MSG gehören: das Handle des Fensters für die die Nachricht bestimmt, die Meldungs-ID, die zwei Message-Parameter, die Zeit, die die Nachricht gepostet wurde, und der Maus-Cursor-Position. Ein Thread kann eine eigene Nachrichtenwarteschlange oder der Warteschlange von einem anderen Thread Nachricht mithilfe der Funktion PostMessage oder PostThreadMessage.

Eine Anwendung kann eine Nachricht aus der Warteschlange entfernen, mithilfe der GetMessage -Funktion. Um eine Nachricht untersuchen, ohne es aus der Warteschlange zu entfernen, kann eine Anwendung die PeekMessage -Funktion verwenden. Diese Funktion füllt MSG mit Informationen über die Meldung.

Nach dem Entfernen einer Nachricht aus der Warteschlange, können eine Anwendung die DispatchMessage -Funktion das System zum Senden der Nachricht mit einer Fensterprozedur für Verarbeitung direkt. DispatchMessage akzeptiert einen Zeiger zu MSG , die durch einen vorherigen Aufruf der Funktion GetMessage oder PeekMessage gefüllt war. DispatchMessage übergibt das Fensterhandle, die Meldungs-ID und die zwei Message-Parameter an die Fensterprozedur, aber nicht die Zeit, die die Nachricht gesendet wurde oder Maus-Cursor-Position. Eine Anwendung kann diese Informationen abrufen, durch Aufrufen der Funktionen GetMessageTime und GetMessagePos beim Verarbeiten einer Nachricht.

Ein Thread kann die WaitMessage -Funktion verwenden, um Steuerelement, um andere Threads zu erzielen, wenn es keine Nachrichten in der Warteschlange hat. Die Funktion unterbricht den Thread und wird nicht zurückgegeben, bis eine neue Nachricht in Warteschlange für den Thread gesetzt wird.

Sie rufen die SetMessageExtraInfo -Funktion, um einen 32-Bit-Wert mit dem aktuellen Thread-Nachrichtenwarteschlange zuordnen. Dann rufen Sie die GetMessageExtraInfo -Funktion zum Abrufen des Werts der letzten Meldung abgerufen, indem die Funktion GetMessage oder PeekMessage zugeordnet.

Index