OnMessage()

Registriert eine Funktion, die jedes Mal automatisch aufgerufen wird, wenn das Skript eine bestimmte Meldung empfängt.

OnMessage(MldNummer , Rückruf, MaxThreads)

Parameter

MldNummer

Die Nummer einer Meldung zwischen 0 und 4294967295 (0xFFFFFFFF), die überwacht oder abgefragt werden soll. Wenn Sie keine Systemmeldung (d.h. eine Meldung unter 0x0400) überwachen wollen, verwenden Sie am besten eine Zahl größer als 4096 (0x1000), falls möglich. Dies verringert das Risiko, dass Meldungen, die intern von aktuellen und zukünftigen AutoHotkey-Versionen verwendet werden, beeinträchtigt werden.

Rückruf

Ein Funktionsname oder in [v1.1.20+] ein Funktionsobjekt. Um einen Funktionsnamen zu übergeben, setzen Sie ihn in Anführungszeichen.

Wie die Rückruffunktion registriert wird und welcher Wert von OnMessage() zurückgegeben wird, ist davon abhängig, ob dieser Parameter eine Zeichenkette oder ein Funktionsobjekt ist. Einzelheiten finden Sie unter Funktionsname vs. Funktionsobjekt.

Die Rückruffunktion akzeptiert vier Parameter und kann wie folgt definiert werden:

MeinRückruf(wParam, lParam, Mld, Hwnd) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Der WPARAM-Wert der Meldung.
  2. Der LPARAM-Wert der Meldung.
  3. Die Meldungsnummer (nützlich, wenn eine Rückruffunktion mehr als eine Meldung überwacht).
  4. Die HWND-Nummer (eindeutige ID) des Fensters oder Steuerelements, das die Meldung empfangen hat. Diese Nummer kann zusammen mit ahk_id verwendet werden.

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden.

WPARAM und LPARAM sind vorzeichenlose 32-Bit-Integer (von 0 bis 232-1) oder vorzeichenfähige 64-Bit-Integer (von -263 bis 263-1), abhängig davon, ob die zur Ausführung verwendete EXE-Datei 32-Bit oder 64-Bit ist. Wenn in einem 32-Bit-Skript ein eingehender Parameter als vorzeichenfähiger Integer vorgesehen ist, können negative Zahlen zum Beispiel wie folgt enthüllt werden:

if (A_PtrSize = 4 && wParam > 0x7FFFFFFF)  ; Die A_PtrSize-Überprüfung stellt sicher, dass das Skript 32-Bit ist.
    wParam := -(~wParam) - 1
MaxThreads [v1.0.47+]

Wenn weggelassen, wird standardmäßig 1 verwendet, d.h. die Rückruffunktion ist auf einen Thread beschränkt. Dies ist in der Regel am besten, weil das Skript sonst die Meldungen nicht in chronologischer Reihenfolge abarbeiten würde, wenn die Rückruffunktion sich selbst unterbricht. Daher sollten Sie als Alternative zu MaxThreads in Betracht ziehen, Critical wie unten beschrieben zu verwenden.

Wenn die Rückruffunktion direkt oder indirekt ein erneutes Senden der Meldung bewirkt, während die Rückruffunktion noch ausgeführt wird, muss ein MaxThreads-Wert größer als 1 oder kleiner als -1 angegeben werden, damit die Rückruffunktion für die neue Meldung aufgerufen werden kann (falls gewünscht). Meldungen, die vom Prozess des Skripts an sich selbst gesendet (nicht gepostet) werden, können nicht verzögert oder gepuffert werden.

[v1.1.20+]: Geben Sie 0 an, um eine zuvor registrierte Rückruffunktion zu deregistrieren. Wenn Rückruf eine Zeichenkette ist, wird die "Legacy"-Überwachung entfernt. Andernfalls wird nur das angegebene Funktionsobjekt deregistriert.

[v1.1.20+]: Wenn mehrere Rückruffunktionen für eine MldNummer registriert sind, werden diese standardmäßig in der Reihenfolge ihrer Registrierung aufgerufen. Um eine Rückruffunktion zu registrieren, die vor allen zuvor registrierten Rückruffunktionen aufgerufen wird, geben Sie einen negativen Wert für MaxThreads an. Zum Beispiel bewirkt OnMessage(Mld, Fn, -2), dass Fn vor allen anderen Rückruffunktionen aufgerufen wird, die zuvor für Mld registriert wurden, und dass maximal 2 Threads für Fn möglich sind. Wenn die Rückruffunktion jedoch bereits registriert ist, bleibt die Reihenfolge unverändert, es sei denn, sie wird deregistriert und dann wieder registriert.

Funktionsname vs. Funktionsobjekt

Der Rückgabewert und das Verhalten von OnMessage ist davon abhängig, ob der Rückruf-Parameter ein Funktionsname oder ein Funktionsobjekt ist.

Funktionsname

Aus Gründen der Abwärtskompatibilität kann maximal eine Rückruffunktion pro MldNummer via Name registriert werden - dies wird als "Legacy"-Überwachung bezeichnet.

Wenn die Legacy-Überwachung zum ersten Mal registriert wird, hängt es vom MaxThreads-Parameter ab, ob sie vor oder nach zuvor registrierten Überwachungen aufgerufen wird. Wenn die Überwachung aktualisiert wird, um eine andere Rückruffunktion aufzurufen, hat dies keinen Einfluss auf die Reihenfolge, es sei denn, die Überwachung wird vorher deregistriert.

Dies registriert oder aktualisiert die aktuelle Legacy-Überwachung für MldNummer (lassen Sie die Anführungszeichen weg, wenn Sie eine Variable übergeben):

Name := OnMessage(MldNummer, "MeinRückruf")

Der Rückgabewert ist einer der folgenden:

Dies deregistriert die aktuelle Legacy-Überwachung für MldNummer (falls vorhanden) und gibt ihren Namen zurück (leer, wenn sie keinen hat):

Name := OnMessage(MldNummer, "")

Dies gibt den Namen der aktuellen Legacy-Überwachung für MldNummer zurück (leer, wenn sie keinen hat):

Name := OnMessage(MldNummer)

Funktionsobjekt

Es können beliebig viele Funktionsobjekte (einschließlich normaler Funktionen) eine bestimmte MldNummer überwachen.

Jede dieser beiden Zeilen registriert ein Funktionsobjekt, das nach allen zuvor registrierten Rückruffunktionen aufgerufen wird:

OnMessage(MldNummer, FunkObj)     ; Option 1
OnMessage(MldNummer, FunkObj, 1)  ; Option 2 (MaxThreads = 1)

Dies registriert ein Funktionsobjekt, das vor allen zuvor registrierten Rückruffunktionen aufgerufen wird:

OnMessage(MldNummer, FunkObj, -1)

Um ein Funktionsobjekt zu deregistrieren, geben Sie 0 für MaxThreads an:

OnMessage(MldNummer, FunkObj, 0)

Misserfolg

Misserfolg tritt auf, wenn Rückruf:

  1. kein Objekt ist, kein Name einer benutzerdefinierten Funktion ist, oder eine leere Zeichenkette ist;
  2. wissentlich mehr als vier Parameter benötigt; oder
  3. in [v1.0.48.05] oder älter ByRef- oder optionale Parameter hat.

In [v1.1.19.03] oder älter tritt Misserfolg auch auf, wenn das Skript versucht, eine neue Meldung zu überwachen, obwohl bereits 500 Meldungen überwacht werden.

Wenn Rückruf ein Objekt ist, wird bei Misserfolg eine Ausnahme ausgelöst. Andernfalls wird eine leere Zeichenkette zurückgegeben.

Zusätzliche Infos für die Rückruffunktion

Neben den oben genannten Parametern kann die Rückruffunktion auch auf die Werte der folgenden internen Variablen zugreifen:

A_Gui: Leer, es sei denn, die Meldung wurde an ein GUI-Fenster oder -Steuerelement gesendet, dann ist A_Gui die Nummer des GUI-Fensters (dieses Fenster wird auch als Standard-GUI-Fenster der Rückruffunktion gesetzt).

A_GuiControl: Leer, es sei denn, die Meldung wurde an ein GUI-Steuerelement gesendet, dann ist A_GuiControl der Variablenname des Steuerelements oder ein anderer Wert, wie in A_GuiControl beschrieben. Einige Steuerelemente werden bestimmte Meldungen nie empfangen. Wenn der Benutzer z.B. auf ein Text-Steuerelement klickt, sendet das Betriebssystem die WM_LBUTTONDOWN-Meldung an das übergeordnete Fenster, nicht an das Steuerelement; folglich ist A_GuiControl leer.

A_GuiX / A_GuiY: Beide enthalten -2147483648, wenn die eingehende Meldung via SendMessage gesendet wurde. Wenn die Meldung via PostMessage gesendet wurde, enthalten die Variablen die Koordinaten des Mauszeigers (relativ zum Bildschirm) zum Zeitpunkt, als die Meldung gepostet wurde.

A_EventInfo: Enthält 0, wenn die eingehende Meldung via SendMessage gesendet wurde. Wenn die Meldung via PostMessage gesendet wurde, enthält die Variable den Tick-Count zum Zeitpunkt, als die Meldung gepostet wurde.

Das zuletzt gefundene Fenster einer Rückruffunktion ist vorerst das übergeordnete Fenster, an das die Meldung gesendet wurde (selbst wenn sie an ein Steuerelement gesendet wurde). Wenn das Fenster versteckt und kein GUI-Fenster ist (wie z.B. das Hauptfenster des Skripts), schalten Sie DetectHiddenWindows ein, bevor Sie es verwenden. Zum Beispiel:

DetectHiddenWindows On
MldElternfenster := WinExist()  ; Speichert die eindeutige ID des Fensters, das die Meldung empfangen hat.

Was die Rückruffunktion zurückgeben muss

Wenn eine Rückruffunktion Return verwendet, dessen Parameter leer ist oder weggelassen wird, oder überhaupt kein Return verwendet, wird die eingehende Meldung nach Abschluss der Rückruffunktion normal weiterverarbeitet. Das gleiche geschieht, wenn die Rückruffunktion mit Exit beendet wird oder einen Laufzeitfehler verursacht, z.B. durch Ausführen einer nicht-existierenden Datei. Die Rückgabe eines Integers bewirkt hingegen ein sofortiges Senden der Antwort, d.h. das Programm verarbeitet die Meldung nicht weiter. Zum Beispiel kann eine Rückruffunktion, die WM_LBUTTONDOWN (0x0201) überwacht, einen Integer zurückgeben, um das Zielfenster daran zu hindern, eine Benachrichtigung zu erhalten, dass ein Mausklick stattgefunden hat. In vielen Fällen (z.B. eine Meldung, die via PostMessage eintrifft) spielt es keine Rolle, welcher Integer zurückgegeben wird. Im Zweifelsfall ist 0 die sicherste Wahl.

Der Bereich von gültigen Rückgabewerten hängt davon ab, ob die EXE-Datei, die das Skript ausführt, 32-Bit oder 64-Bit ist. Bei einem 32-Bit-Skript (A_PtrSize = 4) müssen die Rückgabewerte im Bereich von -231 und 232-1 liegen, und bei einem 64-Bit-Skript (A_PtrSize = 8) im Bereich von -263 und 263-1.

[v1.1.20+]: Wenn mehrere Rückruffunktionen eine bestimmte Meldungsnummer überwachen, werden sie nacheinander aufgerufen, bis eine von ihnen einen nicht-leeren Wert zurückgibt.

Allgemeine Bemerkungen

Im Gegensatz zu einem normalen Funktionsaufruf wird bei Ankunft einer überwachten Meldung die Rückruffunktion als neuer Thread aufgerufen. Aus diesem Grund verwendet die Rückruffunktion vorerst die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows. Diese Standardwerte können im automatischen Ausführungsbereich geändert werden.

Meldungen, die an ein Steuerelement gesendet (nicht gepostet) wurden, werden nicht überwacht, da das System diese direkt an das Steuerelement weiterleitet. Dies ist für systemgenerierte Meldungen nur selten ein Problem, weil die meisten von ihnen gepostet werden.

Jedes Skript, das OnMessage() irgendwo aufruft, ist automatisch persistent. Außerdem wird bei solchen Skripten standardmäßig ein Dialogfenster angezeigt, das den Benutzer fragt, ob die alte Instanz beibehalten oder mit einer neuen Instanz ersetzt werden soll, es sei denn, dies wird mit der #SingleInstance-Direktive überschrieben.

Wenn eine Meldung eintrifft, während die Rückruffunktion aufgrund einer früheren Ankunft derselben Meldung noch läuft, wird die Rückruffunktion standardmäßig nicht erneut aufgerufen; stattdessen wird die Meldung als unüberwacht behandelt. Falls das unerwünscht ist, gibt es mehrere Möglichkeiten, dies zu vermeiden:

Wenn eine überwachte Meldung größer als 0x0311 gepostet wird, während das Skript unterbrechungsfrei ist, wird die Meldung gepuffert, d.h. ihre Rückruffunktion wird erst aufgerufen, wenn das Skript wieder unterbrechbar wird. Allerdings können Meldungen, die gesendet statt gepostet werden, nicht gepuffert werden, da sie einen Rückgabewert liefern müssen. Gepostete Meldungen werden möglicherweise auch nicht gepuffert, wenn eine modale Meldungsschleife läuft, z.B. für ein Systemdialogfenster, eine ListView-Ziehen-Ablegen-Operation oder ein Menü.

Wenn eine überwachte, ungepufferte Meldung eintrifft und das Skript durch die Einstellungen von Thread Interrupt oder Critical unterbrechungsfrei ist, wird der aktuelle Thread unterbrochen, damit die Rückruffunktion aufgerufen werden kann. Wenn das Skript aber absolut unterbrechungsfrei ist - z.B. während ein Menü angezeigt wird, KeyDelay/MouseDelay aktiv ist oder die Zwischenablage geöffnet ist - wird die Rückruffunktion der Meldung nicht aufgerufen und die Meldung als unüberwacht behandelt.

Die Priorität von OnMessage-Threads ist immer 0. Folglich werden keine Meldungen überwacht oder gepuffert, wenn der aktuelle Thread eine Priorität höher als 0 hat.

Bei der Überwachung von Systemmeldungen (unter 0x0400) ist Vorsicht geboten. Wenn z.B. eine Rückruffunktion nicht schnell zum Ende kommt, kann die Antwort auf die Meldung länger dauern als vom System erwartet, was zu Nebeneffekten führen kann. Unerwünschtes Verhalten kann auch auftreten, wenn eine Rückruffunktion die Weiterverarbeitung einer Meldung durch Rückgabe eines Integers unterdrückt, während das System eine andere Verarbeitung oder Antwort erwartet.

Wenn das Skript ein Systemdialogfenster wie z.B. MsgBox anzeigt, werden Meldungen, die an ein Steuerelement gepostet werden, nicht überwacht. Wenn z.B. das Skript ein Mitteilungsfenster anzeigt und der Benutzer eine Schaltfläche in einem GUI-Fenster anklickt, wird die WM_LBUTTONDOWN-Meldung direkt an die Schaltfläche gesendet, ohne die Rückruffunktion aufzurufen.

Ein externes Programm kann Meldungen mittels PostThreadMessage() oder einer anderen API-Funktion direkt an einen Thread des Skripts senden, aber dies wird nicht empfohlen, da solche Meldungen verloren gehen, wenn das Skript ein Systemdialogfenster wie z.B. MsgBox anzeigt. Stattdessen ist es besser, die Meldungen an das Hauptfenster des Skripts oder an eines seiner GUI-Fenster zu posten oder zu senden.

RegisterCallback(), OnExit, OnClipboardChange, Post/SendMessage, Funktionen, Windows-Meldungen, Threads, Critical, DllCall()

Beispiele

Überwacht Mausklicks in einem GUI-Fenster. Siehe auch: GuiContextMenu

Gui, Add, Text,, Klicken Sie irgendwo auf das Fenster.
Gui, Add, Edit, w200 vMeinEdit
Gui, Show
OnMessage(0x0201, "WM_LBUTTONDOWN")
return

WM_LBUTTONDOWN(wParam, lParam)
{
    X := lParam & 0xFFFF
    Y := lParam >> 16
    if A_GuiControl
        Strlmnt := "`n(im Steuerelement " . A_GuiControl . ")"
    ToolTip Sie haben im GUI-Fenster Nr. %A_Gui% auf die Koordinaten %X%x%Y% geklickt.%Strlmnt%
}

GuiClose:
ExitApp

Erkennt das Herunterfahren/Abmelden des Systems und erlaubt dem Benutzer, diesen Vorgang abzubrechen. In Windows Vista und höher erscheint eine Benutzeroberfläche, die anzeigt, welches Programm das Herunterfahren/Abmelden blockiert, und dem Benutzer ermöglicht, das Herunterfahren/Abmelden zu erzwingen. In älteren Betriebssystemen zeigt das Skript eine Sicherheitsabfrage an. Siehe auch: OnExit

; Das folgende DllCall ist optional: Es teilt dem OS mit, dieses Skript zuerst zu beenden (vor allen anderen Anwendungen).
DllCall("kernel32.dll\SetProcessShutdownParameters", "UInt", 0x4FF, "UInt", 0)
OnMessage(0x0011, "WM_QUERYENDSESSION")
return

WM_QUERYENDSESSION(wParam, lParam)
{
    ENDSESSION_LOGOFF := 0x80000000
    if (lParam & ENDSESSION_LOGOFF)  ; Benutzer meldet sich ab.
        Ereignis := "Abmelden"
    else  ; System wird entweder heruntergefahren oder neu gestartet.
        Ereignis := "Herunterfahren"
    try
    {
        ; Bestimmt einen Anzeigetext für die OS-Herunterfahren-UI. Wir
        ; zeigen keine eigene Sicherheitsabfrage an, da wir nur 5 Sekunden
        ; haben, bevor das OS von sich aus die Herunterfahren-UI anzeigt.  
        ; Außerdem kann ein Programm ohne sichtbares Fenster das
        ; Herunterfahren nur blockieren, wenn ein Grund angegeben ist.
        HerunterfahrenSperren("Es wird versucht, " Ereignis " zu verhindern.")
        return false
    }
    catch
    {
        ; ShutdownBlockReasonCreate ist nicht verfügbar, demzufolge läuft
        ; vermutlich Windows XP, 2003 oder 2000, wo wir tatsächlich
        ; das Herunterfahren verhindern können.
        MsgBox, 4,, %Ereignis% aktiv.  Erlauben?
        IfMsgBox Yes
            return true  ; Erlaubt dem OS das Herunterfahren/Abmelden.
        else
            return false  ; Verbietet dem OS das Herunterfahren/Abmelden.
    }
}

HerunterfahrenSperren(Grund)
{
    ; Wenn Ihr Skript eine sichtbare GUI hat, nutzen Sie diese anstelle
    ; von A_ScriptHwnd.
    DllCall("ShutdownBlockReasonCreate", "ptr", A_ScriptHwnd, "wstr", Grund)
    OnExit("HerunterfahrenEntsperren")
}

HerunterfahrenEntsperren()
{
    OnExit(A_ThisFunc, 0)
    DllCall("ShutdownBlockReasonDestroy", "ptr", A_ScriptHwnd)
}

Empfängt eine benutzerdefinierte Meldung und bis zu zwei Zahlen von einem anderen Skript oder Programm (um Zeichenketten statt Zahlen zu senden, siehe nächstes Beispiel).

OnMessage(0x5555, "MldÜberwachung")

MldÜberwachung(wParam, lParam, Mld)
{
    ; Damit der Rückruf schnell zum Ende kommen kann, besser ToolTip verwenden,
    ; weil so etwas wie MsgBox dies verhindern würde:
    ToolTip Meldung %Mld% empfangen:`nWPARAM: %wParam%`nLPARAM: %lParam%
}

; Mit den folgenden Zeilen in einem anderen Skript kann der Rückruf im oberen Skript ausgeführt werden:
SetTitleMatchMode 2
DetectHiddenWindows On
if WinExist("Empfänger.ahk ahk_class AutoHotkey")
    PostMessage, 0x5555, 11, 22  ; Die Meldung wird an das "zuletzt gefundene Fenster" gesendet, wegen WinExist() oben.
DetectHiddenWindows Off  ; Erst nach PostMessage ausschalten.

Sendet eine Zeichenkette beliebiger Länge an ein anderes Skript. Speichern und starten Sie die beiden folgenden Skripte und drücken Sie Win+Leer, um ein Eingabefenster anzuzeigen, das den Benutzer zur Eingabe einer Zeichenkette auffordert. Beide Skripte müssen dieselbe native Kodierung verwenden.

Speichern Sie das folgende Skript unter Receiver.ahk und starten Sie es.

#SingleInstance
OnMessage(0x004A, "WM_COPYDATA_Empfangen")  ; 0x004A ist WM_COPYDATA
return

WM_COPYDATA_Empfangen(wParam, lParam)
{
    ZketteAdresse := NumGet(lParam + 2*A_PtrSize)  ; CopyDataStruct's lpData-Element abrufen.
    KopieDaten := StrGet(ZketteAdresse)  ; Zeichenkette aus der Struktur kopieren.
    ; ToolTip statt MsgBox für eine rechtzeitige Rückgabe verwenden:
    ToolTip %A_ScriptName%`nhat die folgende Zeichenkette empfangen:`n%KopieDaten%
    return true  ; Die Rückgabe von 1 (true) ist der übliche Weg zur Bestätigung dieser Meldung.
}

Speichern Sie das folgende Skript unter Sender.ahk und starten Sie es. Drücken Sie danach den Hotkey Win+Leer.

ZielSkriptTitel := "Receiver.ahk ahk_class AutoHotkey"

#space::  ; WIN+LEER-Hotkey. Drücken Sie ihn, um ein Fenster zur Eingabe des zu sendenden Texts anzuzeigen.
InputBox, ZuSendendeZkette, Text via WM_COPYDATA senden, Tragen Sie den zu sendenden Text ein:
if ErrorLevel  ; Benutzer hat die Abbrechen-Schaltfläche gedrückt.
    return
Ergebnis := WM_COPYDATA_Senden(ZuSendendeZkette, ZielSkriptTitel)
if (Ergebnis = "FAIL")
    MsgBox SendMessage fehlgeschlagen. Existiert der folgende Fenstertitel?:`n%ZielSkriptTitel%
else if (Ergebnis = 0)
    MsgBox Meldung wurde gesendet, aber das Zielfenster hat mit 0 geantwortet, was bedeuten könnte, dass sie ignoriert wurde.
return

WM_COPYDATA_Senden(ByRef ZuSendendeZkette, ByRef ZielSkriptTitel)  ; ByRef verbraucht in diesem Fall weniger Speicher.
; Diese Funktion sendet eine bestimmte Zeichenkette an ein bestimmtes Fenster und gibt die Antwort zurück.
; Die Antwort ist 1, wenn das Zielfenster die Meldung verarbeitet hat, oder 0, wenn es diese ignoriert hat.
{
    VarSetCapacity(KopieDatenStrukt, 3*A_PtrSize, 0)  ; Speicherbereich der Struktur einrichten.
    ; Zuerst das cbData-Element der Struktur auf die Größe der Zeichenkette setzen, inklusive Nullterminator:
    GrößeInBytes := (StrLen(ZuSendendeZkette) + 1) * (A_IsUnicode ? 2 : 1)
    NumPut(GrößeInBytes, KopieDatenStrukt, A_PtrSize)  ; Muss für das OS getan werden.
    NumPut(&ZuSendendeZkette, KopieDatenStrukt, 2*A_PtrSize)  ; lpData auf die Zeichenkette selbst verweisen lassen.
    Vorher_DetectHiddenWindows := A_DetectHiddenWindows
    Vorher_TitleMatchMode := A_TitleMatchMode
    DetectHiddenWindows On
    SetTitleMatchMode 2
    TimeoutWert := 4000  ; Optional. Zeit in Millisekunden, die Empfänger.ahk zum Antworten hat. Standard ist 5000
    ; Send muss verwendet werden, nicht Post.
    SendMessage, 0x004A, 0, &KopieDatenStrukt,, %ZielSkriptTitel%,,,, %TimeoutWert% ; 0x004A ist WM_COPYDATA.
    DetectHiddenWindows %Vorher_DetectHiddenWindows%  ; Ursprüngliche Einstellung für den Aufrufer wiederherstellen.
    SetTitleMatchMode %Vorher_TitleMatchMode%         ; Hier auch.
    return ErrorLevel  ; Die Antwort von SendMessage an den Aufrufer zurückgeben.
}

Das WinLIRC-Client-Skript zeigt Ihnen, wie mit OnMessage() eine Benachrichtigung empfangen werden kann, wenn Daten über eine Netzwerkverbindung eingegangen sind.