PostMessage / SendMessage

Sendet eine Meldung an ein Fenster oder Steuerelement (SendMessage wartet zusätzlich auf eine Bestätigung).

PostMessage, Mld , wParam, lParam, Steuerelement, FensterTitel, FensterText, IgnoriereTitel, IgnoriereText
SendMessage, Mld , wParam, lParam, Steuerelement, FensterTitel, FensterText, IgnoriereTitel, IgnoriereText, Zeitlimit

Parameter

Mld

Die zu sendende Meldungsnummer, die auch ein Ausdruck sein kann. Welche Nummern beispielsweise verwendet werden können, finden Sie in der Meldungsliste.

wParam

Die erste Komponente der Meldung, die auch ein Ausdruck sein kann. Wenn dieser Parameter weggelassen wird oder leer ist, wird eine 0 gesendet.

lParam

Die zweite Komponente der Meldung, die auch ein Ausdruck sein kann. Wenn dieser Parameter weggelassen wird oder leer ist, wird eine 0 gesendet.

Steuerelement

Wenn dieser Parameter weggelassen wird oder leer ist, wird die Meldung direkt an das Zielfenster gesendet, anstatt an eines der darin enthaltenen Steuerelemente. Ansonsten kann dieser Parameter entweder die ClassNN-Bezeichnung (Klassenname und Instanznummer des Steuerelements) oder der Text des Steuerelements sein, die beide mit dem internen Tool Window Spy ermittelt werden können. Verwendet man Text, ist das Übereinstimmungsverhalten abhängig von SetTitleMatchMode.

Um ein Steuerelement via HWND-Nummer (eindeutige ID) anzusteuern, muss der Steuerelement-Parameter leer gelassen und ahk_id %SteuerelementHwnd% als FensterTitel-Parameter übergeben werden (funktioniert auch bei versteckten Steuerelementen, selbst wenn DetectHiddenWindows ausgeschaltet ist). Die HWND-Nummer eines Steuerelements kann üblicherweise via ControlGet Hwnd, MouseGetPos oder DllCall() abgerufen werden.

FensterTitel

Der Titel oder andere Möglichkeiten zum Identifizieren des Zielfensters. Weitere Informationen finden Sie unter FensterTitel-Parameter.

FensterText

Eine Zeichenkette, die in einem der Textelemente des Zielfensters enthalten ist (eventuell vorhandene Textelemente können mit dem internen Tool Window Spy aufgedeckt werden). Versteckte Textelemente werden nur erkannt, wenn DetectHiddenText eingeschaltet ist.

IgnoriereTitel

Alle Fenster, die diesen Wert in ihren Titeln enthalten, werden ignoriert.

IgnoriereText

Alle Fenster, die diesen Wert in ihren Textelementen enthalten, werden ignoriert.

Zeitlimit

[AHK_L 42+]: Die maximale Wartezeit in Millisekunden, die dem Zielfenster zur Verfügung steht, um die Meldung zu verarbeiten. Lässt man diesen Parameter weg, wird standardmäßig 5000 (Millisekunden) verwendet; ältere Versionen von AutoHotkey, die diesen Parameter nicht unterstützen, verwenden auch diesen Standardwert. Wenn das Zielfenster die Meldung innerhalb dieser Zeit nicht verarbeitet, wird der Befehl beendet und ErrorLevel auf das Wort FAIL gesetzt. Dieser Parameter kann ein Ausdruck sein.

ErrorLevel

[v1.1.04+]: Diese Befehle sind in der Lage, bei Misserfolg eine Ausnahme auszulösen. Weitere Informationen finden Sie unter Laufzeitfehler.

PostMessage: ErrorLevel wird auf 1 gesetzt, wenn es ein Problem gab - z. B. wenn das Zielfenster oder Steuerelement nicht vorhanden ist. Ansonsten wird es auf 0 gesetzt.

SendMessage: ErrorLevel wird auf FAIL gesetzt, wenn es ein Problem gab oder der Befehl die Zeit überschritten hat. Ansonsten wird es auf das numerische Ergebnis der Meldung gesetzt, das manchmal eine "Antwort" sein könnte, abhängig von der Art der Meldung und ihrem Zielfenster.

Der mögliche Wertebereich ist abhängig davon, welches Zielfenster verwendet wird und welche Version von AutoHotkey läuft. Bei einer 32-Bit-Version von AutoHotkey, oder wenn das Zielfenster 32-Bit ist, wird das Ergebnis ein vorzeichenloser 32-Bit-Integer zwischen 0 und 4294967295 sein. Bei einer 64-Bit-Version von AutoHotkey mit einem 64-Bit-Fenster wird das Ergebnis ein vorzeichenfähiger 64-Bit-Integer zwischen -9223372036854775808 und 9223372036854775807 sein.

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

MldAntwort := ErrorLevel << 32 >> 32

Diese Umwandlung könnte auch in der 64-Bit-Version von AutoHotkey notwendig sein, weil die Ergebnisse von 32-Bit-Fenstern mit Nullen erweitert sind. Zum Beispiel würde ein Ergebnis von -1, zurückgegeben von einem 32-Bit-Fenster, in einer beliebigen AutoHotkey-Version als 0xFFFFFFFF gesehen werden, aber ein Ergebnis von -1, zurückgegeben von einem 64-Bit-Fenster, in der 32-Bit-Version als 0xFFFFFFFF und in der 64-Bit-Version als -1.

Bemerkungen

Seien Sie vorsichtig, wenn Sie solche Befehle verwenden - das Senden einer Meldung an das falsche Fenster (oder Senden einer ungültigen Meldung) kann dazu führen, dass die Zielanwendung sich falsch verhält oder abstürzt. Die meisten Anwendungen sind nicht darauf abgestimmt, bestimmte Arten von Meldungen aus externen Quellen zu erwarten.

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

Die wParam- und lParam-Parameter sollten Integer sein. Wenn AutoHotkey oder das Zielfenster 32-Bit ist, werden nur die unteren 32 Bits verwendet; also sollte der Wert zwischen -2147483648 und 4294967295 (0xFFFFFFFF) liegen. Wenn sowohl AutoHotkey als auch das Zielfenster 64-Bit sind, kann jeder Integer, der von AutoHotkey unterstützt wird, verwendet werden. Ein Präfix von 0x kennzeichnet einen hexadezimalen Wert, wie bei allen Integer-Werten in AutoHotkey. Zum Beispiel wäre 0xFF das gleiche wie 255.

Es ist möglich, eine Zeichenkette via wParam oder lParam zu senden, indem man die Adresse einer Variable angibt. Das folgende Beispiel verwendet den Adressoperator (&), um dies zu tun:

SendMessage, 0x000C, 0, &MeineVar, ClassNN, FensterTitel  ; 0x000C ist WM_SETTEXT

[v1.0.43.06+]: Eine Zeichenkette in MeineVar wird korrekt erkannt, der vom Empfänger der Meldung eingefügt wurde, ohne dass zusätzliche Schritte notwendig sind. Diese Erkennung funktioniert allerdings nur, wenn das erste Zeichen des Parameters ein Und-Zeichen (&) ist; zum Beispiel würde 5+&MeineVar nicht funktionieren, sondern nur &MeineVar oder &MeineVar+5.

Eine direkt geschriebene bzw. in Anführungszeichen gesetzte Zeichenkette kann auch gesendet werden (in diesem Fall sollte der &-Operator weggelassen werden):

#Persistent
ListVars
WinWaitActive, ahk_class AutoHotkey
SendMessage, 0x000C, 0, "Neuer Titel"  ; 0x000C ist WM_SETTEXT

Um allen Fenstern im Betriebssystem eine Meldung zu senden - einschließlich solcher, die versteckt oder deaktiviert sind - fügen Sie ahk_id 0xFFFF in FensterTitel ein (0xFFFF ist HWND_BROADCAST). Diese Technik sollte nur für Meldungen benutzt werden, die zum Broadcasten geeignet sind, wie z. B.:

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

Mit OnMessage() kann ein Skript eine Meldung abfangen.

Um mehr über das Verwenden solcher Befehle zu erfahren, siehe Tutorial zum Senden von Meldungen.

Fenstertitel und -texte sind Groß-/Kleinschreibung-sensitiv. Versteckte Fenster werden nur erkannt, wenn DetectHiddenWindows eingeschaltet ist.

Meldungsliste, Tutorial zum Senden von Meldungen, OnMessage(), Winamp automatisieren, DllCall(), ControlSend, WinMenuSelectItem

Beispiele

Drücken Sie einen Hotkey, um den Bildschirm auszuschalten.

#o:: ; WIN+O
Sleep 1000  ; Gibt dem Benutzer die Chance, die Tasten loszulassen (falls das Loslassen der Tasten den Bildschirm wieder aufwecken sollte).
; Schaltet den Bildschirm aus:
SendMessage, 0x0112, 0xF170, 2,, Program Manager  ; 0x0112 ist WM_SYSCOMMAND, 0xF170 ist SC_MONITORPOWER.
; Die 2 oben kann mit -1 ersetzt werden, um den Bildschirm einzuschalten,
; oder mit 1, um den Energiesparmodus des Bildschirms zu aktivieren.
return

Startet den vom Benutzer festgelegten 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).

ControlGetFocus, Steuerelement, A
SendMessage, 0x0115, 0, 0, %Steuerelement%, A

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

ControlGetFocus, Steuerelement, A
SendMessage, 0x0115, 1, 0, %Steuerelement%, A

Schaltet die Tastaturbelegung/Sprache des aktiven Fensters auf Englisch.

PostMessage, 0x0050, 0, 0x4090409,, A  ; 0x0050 ist WM_INPUTLANGCHANGEREQUEST.

Fragt Winamp, welche Track-Nummer zurzeit aktiv ist (weitere Informationen finden Sie unter Winamp automatisieren).

SetTitleMatchMode, 2
SendMessage, 0x0400, 0, 120,, - Winamp
if (ErrorLevel != "FAIL")
{
    ErrorLevel++  ; Die Zählung von Winamp beginnt bei "0", also um 1 erhöhen.
    MsgBox, Track #%ErrorLevel% ist aktiv oder wird abgespielt.
}

Ermittelt die Prozess-ID eines AHK-Skripts (eine Alternative zu WinGet PID).

SetTitleMatchMode, 2
DetectHiddenWindows, On
SendMessage, 0x0044, 0x405, 0, , BeliebigesSkript.ahk - AutoHotkey v
MsgBox %ErrorLevel% ist die Prozess-ID.