PostMessage / SendMessage

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

PostMessage, Meldung , wParam, lParam, Steuerelement, Fenstertitel, Fenstertext, Titelausnahme, Textausnahme
SendMessage, Meldung , wParam, lParam, Steuerelement, Fenstertitel, Fenstertext, Titelausnahme, Textausnahme, Zeitüberschreitung

Parameter

Meldung

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. Fehlt dieser Parameter oder ist er leer, wird eine 0 gesendet.

lParam

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

Steuerelement

Fehlt dieser Parameter oder ist er leer, wird die Meldung direkt an das Zielfenster gesendet, anstatt an eines der darin enthaltenen Steuerelemente. Ansonsten kann dieser Parameter entweder das ClassNN (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 mit dem Fenster-Handle (HWND) eines Steuerelements zu agieren, lässt man den Steuerelement-Parameter leer und übergibt ahk_id %SteuerelementHwnd% als Fenstertitel-Parameter (funktioniert auch bei versteckten Steuerelementen, selbst wenn DetectHiddenWindows ausgeschaltet ist). Der Fenster-Handle (HWND) eines Steuerelements wird üblicherweise via ControlGet Hwnd, MouseGetPos oder DllCall abgerufen.

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.

Titelausnahme

Ignoriert Fenster, deren Titel diesen Wert enthalten.

Textausnahme

Ignoriert Fenster, deren Textelemente diesen Wert enthalten.

Zeitlimit

[AHK_L 42+]: Die maximale Wartezeit in Millisekunden, in der das Zielfenster die Meldung verarbeiten kann. Fehlt dieser Parameter, gilt standardmäßig 5000 (Millisekunden); in den älteren Versionen von AutoHotkey, die diesen Parameter nicht unterstützen, gilt dieser Wert auch. 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 ein vorzeichenfähigen Wert umgewandelt werden:

Meldeantwort := 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 zum falschen 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, 0xC, 0, &MeineVar, ClassNN, Fenstertitel  ; 0XC 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):

Run Notepad
WinWait Unbenannt - Editor
SendMessage, 0xC, 0, "Neuer Editor-Titel"  ; 0XC ist WM_SETTEXT

Um allen Fenstern im Betriebssystem eine Meldung zu senden - einschließlich solcher, die versteckt oder deaktiviert sind - fügt man 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, 0x1A,,,, ahk_id 0xFFFF  ; 0x1A 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.

Siehe auch

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

Beispiele

#o::  ; WIN+O-Hotkey zum Ausschalten des Bildschirms.
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, 0x112, 0xF170, 2,, Program Manager  ; 0x112 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, 0x112, 0xF140, 0,, Program Manager  ; 0x112 ist WM_SYSCOMMAND und 0xF140 ist SC_SCREENSAVE.

; Eine Zeile nach oben scrollen (bei einem Steuerelement mit vertikalem Scrollbalken):
ControlGetFocus, Steuerelement, A
SendMessage, 0x115, 0, 0, %Steuerelement%, A

; Eine Zeile nach unten scrollen:
ControlGetFocus, Steuerelement, A
SendMessage, 0x115, 1, 0, %Steuerelement%, A

; Schaltet die Tastaturbelegung/Sprache des aktiven Fensters auf Englisch:
PostMessage, 0x50, 0, 0x4090409,, A  ; 0x50 ist WM_INPUTLANGCHANGEREQUEST.

; Dieses Beispiel fragt Winamp, welche Track-Nummer zurzeit aktiv ist:
SetTitleMatchMode, 2
SendMessage, 1024, 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.
}
; Siehe Winamp automatisieren für mehr Informationen.

; Um die Prozess-ID eines AHK-Skripts zu finden (eine Alternative zu "WinGet PID"):
SetTitleMatchMode, 2
DetectHiddenWindows, On
SendMessage, 0x44, 0x405, 0, , BeliebigesSkript.ahk - AutoHotkey v
MsgBox %ErrorLevel% ist die Prozess-ID.