SendMessage

Sendet eine Meldung an ein Fenster oder Steuerelement und wartet auf eine Bestätigung.

Ergebnis := SendMessage(MldNummer , wParam, lParam, Steuerelement, FensterTitel, FensterText, AusnahmeTitel, AusnahmeText, Zeitlimit)

Parameter

MldNummer

Typ: Integer

Die zu sendende Meldungsnummer. Einige solcher Nummern finden Sie unter Windows-Meldungen.

wParam, lParam

Typ: Integer oder Objekt

Wenn einer der Parameter weggelassen wird, wird 0 gesendet. Andernfalls geben Sie die erste und zweite Komponente der Meldung an.

Jeder Parameter muss ein Integer sein, oder ein Objekt mit einer Ptr-Eigenschaft, wie z.B. ein Buffer. Verwenden Sie für Meldungen, die einen Pointer zu einer Zeichenkette benötigen, ein Buffer-Objekt oder die StrPtr-Funktion. Wenn die in einer Variable enthaltene Zeichenkette durch die Übergabe der Variablenadresse an SendMessage geändert wird, muss die Länge der Variable anschließend durch Aufruf von VarSetStrCapacity(&MeineVar, -1) aktualisiert werden.

Wenn AutoHotkey oder das Zielfenster 32-Bit ist, werden nur die unteren 32 Bits des Parameters verwendet, d.h. die Werte werden gekürzt, wenn sie vorzeichenfähig sind und außerhalb des Bereichs von -2147483648 bis 4294967295 (-0x80000000 bis 0x7FFFFFFF) liegen oder wenn sie vorzeichenlos sind und außerhalb des Bereichs von 0 bis 4294967295 (0xFFFFFFFF) liegen. Wenn sowohl AutoHotkey als auch das Zielfenster 64-Bit sind, kann ein beliebiger von AutoHotkey unterstützter Integerwert verwendet werden.

Steuerelement

Typ: Zeichenkette, Integer oder Objekt

Wenn weggelassen, wird die Meldung direkt an das Zielfenster gesendet, nicht an eines seiner Steuerelemente. Andernfalls geben Sie die ClassNN-Bezeichnung, den Text oder die HWND-Nummer des Steuerelements an, oder ein Objekt mit einer Hwnd-Eigenschaft. Einzelheiten finden Sie unter Der Steuerelement-Parameter.

Die HWND-Nummer muss nicht unbedingt die HWND-Nummer eines Steuerelements (bzw. eines untergeordneten Fensters) sein. Es kann auch die HWND-Nummer eines Top-Level-Fensters verwendet werden.

FensterTitel, FensterText, AusnahmeTitel, AusnahmeText

Typ: Zeichenkette, Integer oder Objekt

Wenn jeder dieser Parameter leer ist oder weggelassen wird, wird das Zuletzt Gefundene Fenster verwendet. Andernfalls geben Sie für FensterTitel einen Fenstertitel oder andere Kriterien zur Identifizierung des Zielfensters und/oder für FensterText eine Teilzeichenkette aus einem Textelement des Zielfensters an (Textelemente können mit dem internen Tool "Window Spy" in Erfahrung gebracht werden).

AusnahmeTitel und AusnahmeText können verwendet werden, um ein oder mehrere Fenster anhand ihres Titels oder Textes auszuschließen. Ihre Angabe ähnelt der von FensterTitel und FensterText, außer dass AusnahmeTitel keine anderen Kriterien als den Fenstertitel erkennt.

Fenstertitel und -texte sind Groß-/Kleinschreibung-sensitiv. Standardmäßig werden versteckte Fenster nicht erkannt und versteckte Textelemente erkannt, was mit DetectHiddenWindows und DetectHiddenText geändert werden kann. Standardmäßig kann ein Fenstertitel den angegebenen FensterTitel oder AusnahmeTitel an beliebiger Stelle enthalten, um eine Übereinstimmung zu sein, was mit SetTitleMatchMode geändert werden kann.

Zeitlimit

Typ: Integer

Wenn weggelassen, wird standardmäßig 5000 verwendet. Andernfalls geben Sie die maximale Wartezeit in Millisekunden an, die dem Zielfenster zur Verfügung steht, um die Meldung zu verarbeiten. Wenn die Meldung innerhalb dieser Zeit nicht verarbeitet wurde, wird ein TimeoutError ausgelöst. Geben Sie 0 an, um unendlich lang zu warten. Eine negative Zahl bewirkt, dass SendMessage sofort das Zeitlimit überschreitet.

Rückgabewert

Typ: Integer

Diese Funktion gibt das Ergebnis der Meldung zurück, das manchmal eine "Antwort" sein kann, abhängig von der Art der Meldung und ihrem Zielfenster.

Der gültige Wertebereich hängt vom Zielfenster und der aktuell zum Ausführen verwendeten AutoHotkey-Version ab. Wenn eine 32-Bit-Version von AutoHotkey verwendet wird oder wenn das Zielfenster 32-Bit ist, ist das Ergebnis ein vorzeichenloser 32-Bit-Integer zwischen 0 und 4294967295. Wenn eine 64-Bit-Version von AutoHotkey mit einem 64-Bit-Fenster verwendet wird, ist das Ergebnis ein vorzeichenfähiger 64-Bit-Integer zwischen -9223372036854775808 und 9223372036854775807.

Wenn das Ergebnis als vorzeichenfähiger 32-Bit-Integer (ein Wert von -2147483648 bis 2147483648) gedacht ist, kann es wie folgt auf 32-Bit gekürzt und in einen vorzeichenfähigen Wert umgewandelt werden:

MldAntwort := MldAntwort << 32 >> 32

Diese Umwandlung kann auch in einer 64-Bit-Version von AutoHotkey erforderlich sein, da die Ergebnisse von 32-Bit-Fenstern mit Nullen aufgefüllt werden. Zum Beispiel wird das Ergebnis -1 von einem 32-Bit-Fenster als 0xFFFFFFFF in jeder AutoHotkey-Version gesehen, während das Ergebnis -1 von einem 64-Bit-Fenster als 0xFFFFFFFF in einer 32-Bit-Version von AutoHotkey und als -1 in einer 64-Bit-Version von AutoHotkey gesehen wird.

Fehlerbehandlung

Es wird ein TargetError ausgelöst, wenn das Fenster oder Steuerelement nicht gefunden werden konnte.

Ein TimeoutError wird ausgelöst, wenn die Meldung das Zeitlimit überschritten hat.

Es wird ein OSError ausgelöst, wenn die Meldung nicht gesendet werden konnte. Wenn z.B. das Zielfenster auf einer höheren Integritätsstufe läuft als das Skript (d.h. das Zielfenster läuft mit Adminrechten, das Skript nicht), können Meldungen blockiert werden.

Bemerkungen

Seien Sie vorsichtig bei der Verwendung dieser Funktion - das Senden einer Meldung an das falsche Fenster (oder das Senden einer ungültigen Meldung) kann dazu führen, dass die Zielanwendung falsch reagiert oder abstürzt. Die meisten Anwendungen sind nicht dafür ausgelegt, bestimmte Arten von Meldungen aus externen Quellen zu empfangen.

SendMessage wartet, bis das Zielfenster die Meldung verarbeitet hat oder bis das Zeitlimit überschritten wurde. PostMessage hingegen platziert die Meldung in die Meldungswarteschlange des Zielfensters, ohne auf eine Bestätigung und Antwort zu warten.

Zeichenkettenparameter müssen via Adresse übergeben werden. Zum Beispiel:

ListVars
WinWaitActive "ahk_class AutoHotkey"
SendMessage 0x000C, 0, StrPtr("Neuer Titel")  ; 0X000C ist WM_SETTEXT

Um eine Meldung an alle Fenster im Betriebssystem zu senden - auch an solche, die versteckt oder deaktiviert sind - fügen Sie 0xFFFF in FensterTitel ein (0xFFFF ist HWND_BROADCAST). Diese Technik sollte nur für Meldungen verwendet werden, die zum Broadcasten geeignet sind, wie zum Beispiel:

SendMessage 0x001A,,,, 0xFFFF  ; 0x001A ist WM_SETTINGCHANGE

Mit OnMessage kann ein Skript eine Meldung abfangen.

Eine Erklärung zur Verwendung dieser Funktion finden Sie unter PostMessage / SendMessage Tutorial.

PostMessage, Meldungsliste, PostMessage / SendMessage Tutorial, OnMessage, Winamp automatisieren, DllCall, ControlSend, MenuSelect

Beispiele

Schaltet den Bildschirm via Hotkey aus. Ersetzen Sie in der SendMessage-Zeile die Zahl 2 mit -1, um den Bildschirm einzuschalten, oder ersetzen Sie sie mit 1, um den Energiesparmodus des Bildschirms zu aktivieren.

#o::  ; Win+O-Hotkey
{
    Sleep 1000  ; Dem Benutzer die Chance geben, die Tasten loszulassen (falls ihr Loslassen den Bildschirm wieder aufweckt).
    ; Bildschirm ausschalten:
    SendMessage 0x0112, 0xF170, 2,, "Program Manager"  ; 0x0112 ist WM_SYSCOMMAND, 0xF170 ist SC_MONITORPOWER.
}

Startet den vom Benutzer eingestellten Bildschirmschoner.

SendMessage 0x0112, 0xF140, 0,, "Program Manager"  ; 0x0112 ist WM_SYSCOMMAND und 0xF140 ist SC_SCREENSAVE.

Scrollt eine Zeile nach oben (bei einem Steuerelement mit vertikalem Scrollbalken).

SendMessage 0x0115, 0, 0, ControlGetFocus("A")

Scrollt eine Zeile nach unten (bei einem Steuerelement mit vertikalem Scrollbalken).

SendMessage 0x0115, 1, 0, ControlGetFocus("A")

Fragt Winamp, welche Titelnummer gerade aktiv ist (weitere Informationen finden Sie unter Winamp automatisieren).

SetTitleMatchMode 2
TitelNummer := SendMessage(0x0400, 0, 120,, "- Winamp")
TitelNummer++  ; Zählung von Winamp beginnt bei 0, also um 1 erhöhen.
MsgBox "Titel Nr. " TitelNummer " ist aktiv oder wird gerade abgespielt."

Ruft die Prozess-ID eines AHK-Skripts ab (eine Alternative zu WinGetPID).

SetTitleMatchMode 2
DetectHiddenWindows true
PID := SendMessage(0x0044, 0x405, 0, , "BeliebigesSkript.ahk - AutoHotkey v")
MsgBox PID " ist die Prozess-ID."