Nachrichtenbearbeitung

Zurück Zum Inhaltsverzeichnis Weiter

In einem nachrichtenbasierenden System, wie WINDOWS es ist, erhält eine Anwendung vom Betriebssystem eine Nachricht übermittelt wenn ein beliebiges Ereignis, wie z.B. das Drücken einer Maustaste, eintrifft. Für die Bearbeitung von Nachrichten stellt WINDOWS einen Satz API-Funktionen zur Verfügung die nun betrachtet werden.

Sehen wir uns zunächst an, wie eine Anwendung eine Nachricht empfängt. Wenn eine Anwendung auf eine Nachricht wartet so kann sie dies auf zweierlei Arten tun:

  • Sie wartet bis eine Nachricht eintrifft.
  • Sie prüft nur ab ob eine Nachricht vorliegt.

Um auf das Eintreffen einer Nachricht zu warten, ruft die Anwendung die API-Funktion GetMessage(...) auf. Durch den Aufruf dieser Funktion bleibt die Anwendung solange im inaktiven Zustand, bis eine Nachricht eintrifft. Man sagt dazu auch, die Anwendung ist suspendiert. Während dieser Zeit wird keine CPU-Zeit von der Anwendung benötigt. Trifft eine Nachricht für die Anwendung ein, so kehrt die Funktion wieder zurück und liefert innerhalb der vorhin beschriebenen Nachrichtenstruktur die Nachricht zurück. Über Parameter kann der Funktion GetMessage(...) noch mitgeteilt werden, welche Nachrichten empfangen werden sollen, und auch für welche Fenster. Diese Fenster müssen aber der Anwendung gehören (denn eine Anwendung kann durchaus mehrere Fenster besitzen). Eine wichtige Rolle spielt der Returnwert der Funktion. Wurde eine WM_QUIT Nachricht ausgelesen, so liefert die Funktion den Wert '0' ( = FALSE) zurück. Diese WM_QUIT Nachricht teilt der Anwendung mit dass sie beendet werden soll. Mehr zu den Funktionsparametern und zum Returnwert erfahren Sie wenn Sie die Funktion weiter vorne im Text anklicken.

Anwendungen können in der Regel nur Nachrichten an sich selbst empfangen. Soll eine Anwendung auch Nachrichten von fremden Anwendungen überwachen, so kann dies nur durch einen so genannten Hook geschehen. Dieser Hook klinkt sich praktisch in die Nachrichtenverarbeitung des Systems ein und meldet dann alle eintreffenden Nachrichten. Ein praktisches Beispiel dafür ist das in der nächsten Lektion behandelte Tool SPY.

Kommen wir nun zum zweiten Fall. Möchte die Anwendung hingegen nur abprüfen ob eine Nachricht vorliegt oder nicht, so ruft Sie anstelle von GetMessage(...) die API-Funktion PeekMessage(...) auf. Diese Funktion kehrt immer sofort wieder zurück. Der Returnwert der Funktion gibt dann an ob eine Nachricht vorhanden ist oder nicht. Mehr zur Funktion erfahren Sie auch hier wenn Sie die Funktion anklicken.

Es gibt noch eine weitere Funktion namens WaitMessage(...) zum Empfangen von Nachrichten. Sie kann verwendet werden um auf eine beliebige Nachricht zu warten; die Nachricht selbst wird dabei nicht aus der Nachrichtenschlange entfernt. Mehr dazu in der Online-Hilfe zum Compiler.

Damit ist der Empfang von Nachrichten abgeschlossen. Doch außer dass eine Anwendung Nachrichten empfangen kann, kann sie auch selbst Nachrichten versenden. Und hier gibt es ebenfalls wieder zwei Möglichkeiten:

  • Die Anwendung wartet nach dem Versenden der Nachricht solange bis der Empfänger die Nachricht verarbeitet hat.
  • Die Anwendung sendet die Nachricht nur ab und kehrt unmittelbar danach wieder zurück, ohne auf die Bearbeitung der Nachricht zu warten.

Muss die Anwendung auf die Verarbeitung der von ihr versendeten Nachricht warten, so ruft sie die API-Funktion SendMessage(...) auf. Wenn Sie sich die Funktion einmal näher ansehen werden Sie feststellen, dass die Funktionsparameter genau mit den ersten vier Elementen der vorhin beschriebenen Nachrichtenstruktur übereinstimmen. Zusätzlich können Sie diese Funktion auch dazu einsetzen, eine Nachricht an alle Top-Level Fenster (Hauptfenster der Anwendungen) im System zu senden. Mehr dazu wieder bei der Beschreibung der Funktion. Als Returnwert liefert die Funktion das Ergebnis der Nachrichtenbearbeitung durch den Empfänger zurück. Weitere Informationen zur Nachrichtenbearbeitung durch den Empfänger erhalten Sie im nächsten Kapitel Einfache Programme ohne MFC.

Kann die Nachricht vom Empfänger asynchron, d.h. zu einem beliebigem Zeitpunkt, verarbeiten werden, so wird zum Versenden der Nachricht die Funktion PostMessage(...) aufgerufen. Diese Funktion legt die gesendete Nachricht nur in der Nachrichtenschlange des Empfängers ab und kehrt dann sofort wieder zurück.

Es gibt u.a. noch zwei weitere Funktionen PostThreadMessage(...) und ReplyMessage(...) zum Versenden von Nachrichten. Näheres dazu entnehmen Sie bitte der Online-Hilfe.

Doch damit nun genug der Theorie, wenden wir uns in der nächsten Lektion der Praxis zu. Dort erfahren Sie, wie sie mit Hilfe des Tools SPY den Nachrichtenverkehr eines Fensters überwachen können.

Zurück Zum Inhaltsverzeichnis Weiter


Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470