Meldungsschleife

Eine einfache Nachrichtenschleife besteht aus einem Funktionsaufruf für jede dieser drei Funktionen: GetMessage, TranslateMessageund DispatchMessage.

MSG msg;

während (GetMessage (Amp; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

Die GetMessage -Funktion Ruft eine Nachricht aus der Warteschlange ab und kopiert sie in eine Struktur vom Typ MSG. Es gibt einen Wert ungleich NULL zurück, es sei denn, es die Nachricht WM_QUIT trifft in denen es Fall FALSE zurückgibt und die Schleife endet. In einer Singlethread-Anwendung ist beendet die Meldungsschleife oft der erste Schritt beim Schließen der Anwendung. Eine Anwendung kann eine eigene Schleife beenden mithilfe der Funktion PostQuitMessage in der Regel als Reaktion auf die Nachricht WM_DESTROY in der Fensterprozedur der Anwendung Hauptfenster.

Wenn Sie ein Fensterhandle als zweiter Parameter der GetMessageangeben, werden nur Nachrichten für das angegebene Fenster aus der Warteschlange abgerufen. GetMessage können auch filtern Nachrichten in der Warteschlange abrufen nur Nachrichten, die innerhalb eines angegebenen Bereichs liegen. Weitere Informationen zum Filtern von Nachrichten finden Sie unter Message Filtering.

Meldungsschleife des Threads muss TranslateMessage enthalten, wenn der Thread ist Zeicheneingabe von der Tastatur zu erhalten. Das System erzeugt virtuelle Taste Nachrichten (WM_KEYDOWN und WM_KEYUP) jedes Mal, wenn der Benutzer eine Taste drückt. Eine virtual-Key-Nachricht enthält einen virtual-Key-Code, der angibt, welche Taste gedrückt wurde, aber nicht seinen Charakter Wert. Um diesen Wert abzurufen, muss die Meldungsschleife TranslateMessage, enthalten, übersetzt die virtual-Key-Nachricht in eine Nachricht Zeichen (WM_CHAR) und platziert es in die Nachrichtenwarteschlange der Anwendung zurück. Die Charakter-Nachricht kann dann auf eine spätere Iteration der Nachrichtenschleife entfernt und in einer Fensterprozedur versandt.

Die DispatchMessage -Funktion sendet eine Nachricht an die Fensterprozedur verknüpft mit den Fenster-Handle in der MSG -Struktur angegeben. Wenn das Fensterhandle HWND_TOPMOST ist, sendet DispatchMessage die Nachricht an die Fenster-Verfahren der alle Fenster der obersten Ebene im System. Wenn das Fensterhandle NULL ist, nichts DispatchMessage mit der Meldung.

Hauptthread der Anwendung beginnt seine Meldungsschleife nach Initialisierung der Anwendungs und dem Erstellen mindestens ein Fenster. Einmal gestartet, weiterhin die Meldungsschleife aus dem Thread-Nachrichtenwarteschlange Nachrichten abrufen und sie auf die entsprechenden Fenster Versand. Die Meldungsschleife beendet, wenn die GetMessage -Funktion die WM_QUIT Nachricht aus der Warteschlange entfernt.

Für eine Message Queue, ist nur eine Meldungsschleife erforderlich, selbst wenn eine Anwendung viele Windows enthält. DispatchMessage sendet immer die Meldung an die zünftig Fenster; Dies ist da jede Nachricht in der Warteschlange ein MSG -Struktur, die das Handle des Fensters enthält ist, zu der die Nachricht gehört.

Sie können eine Meldungsschleife in verschiedenster Weise ändern. Beispielsweise können Sie Nachrichten aus der Warteschlange abrufen, ohne sie zu einem Fenster verteilt. Dies ist nützlich für Anwendungen, die Nachrichten nicht angeben eines Fensters bereitstellen. Sie können auch direkte GetMessage Suche nach bestimmten Nachrichten, andere Nachrichten in der Warteschlange verlassen. Dies ist nützlich, wenn Sie die übliche FIFO-Reihenfolge der Nachrichtenwarteschlange vorübergehend umgehen müssen.

Eine Anwendung, die Zugriffstasten verwendet muss Befehlsmeldungen Tastaturmeldungen übersetzen können. Hierzu muss die Meldungsschleife der Anwendung einen Aufruf an die TranslateAccelerator -Funktion enthalten. Weitere Informationen zu Zugriffstasten finden Sie unter Zugriffstasten.

Wenn ein Thread ein nicht modales Dialogfeld verwendet, muss die Nachrichtenschleife die Funktion IsDialogMessage enthalten damit das Dialogfeld Tastatureingaben empfangen kann.

Index