PostMessage / SendMessage

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

PostMessage, MldNummer , wParam, lParam, Steuerelement, FensterTitel, FensterText, AusnahmeTitel, AusnahmeText
SendMessage, MldNummer , wParam, lParam, Steuerelement, FensterTitel, FensterText, AusnahmeTitel, AusnahmeText, Zeitlimit

Parameter

MldNummer

Die zu sendende Meldungsnummer. Kann ein Ausdruck sein. Einige solcher Nummern finden Sie unter Windows-Meldungen.

wParam

Wenn leer oder weggelassen, wird 0 gesendet. Andernfalls geben Sie die erste Komponente der Meldung an. Kann ein Ausdruck sein.

lParam

Wenn leer oder weggelassen, wird 0 gesendet. Andernfalls geben Sie die zweite Komponente der Meldung an. Kann ein Ausdruck sein.

Steuerelement

Wenn leer oder weggelassen, wird die Meldung direkt an das Zielfenster gesendet, nicht an eines seiner Steuerelemente. Andernfalls geben Sie entweder die ClassNN-Bezeichnung (Klassenname und Instanznummer des Steuerelements) oder den Text des Steuerelements an, die beide mit dem internen Tool "Window Spy" ermittelt werden können. Wenn Text verwendet wird, ist das Übereinstimmungsverhalten abhängig von SetTitleMatchMode.

Um mit dem Fensterhandle (HWND) eines Steuerelements zu arbeiten, lassen Sie den Steuerelement-Parameter leer und übergeben Sie ahk_id %StrlmntHwnd% als FensterTitel-Parameter (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, FensterText, AusnahmeTitel, AusnahmeText

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 muss ein Fenstertitel mit dem angegebenen FensterTitel oder AusnahmeTitel beginnen, um eine Übereinstimmung zu sein, was mit SetTitleMatchMode geändert werden kann.

Zeitlimit [AHK_L 42+]

Wenn leer oder weggelassen, wird standardmäßig 5000 verwendet, was dem Standardverhalten in älteren Versionen von AutoHotkey entspricht, die diesen Parameter nicht unterstützen. 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 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 ein Problem aufgetreten ist, z.B. wenn das Zielfenster oder Steuerelement nicht existiert. Andernfalls wird es auf 0 gesetzt.

SendMessage: ErrorLevel wird auf FAIL gesetzt, wenn ein Problem aufgetreten ist oder der Befehl das Zeitlimit überschritten hat. Andernfalls wird es auf das numerische Ergebnis der Meldung gesetzt, 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 := ErrorLevel << 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.

Bemerkungen

Seien Sie vorsichtig bei der Verwendung dieser Befehle - 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.

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

Die wParam- und lParam-Parameter müssen Integer sein. Wenn AutoHotkey oder das Zielfenster 32-Bit ist, werden nur die unteren 32 Bits verwendet, d.h. der Wert muss zwischen -2147483648 und 4294967295 (0xFFFFFFFF) liegen. Wenn sowohl AutoHotkey als auch das Zielfenster 64-Bit sind, kann ein beliebiger von AutoHotkey unterstützter Integerwert verwendet werden. Wie bei allen Integerwerten in AutoHotkey kennzeichnet ein 0x-Präfix einen hexadezimalen Wert. Zum Beispiel ist 0xFF äquivalent zu 255.

Es ist möglich, eine Zeichenkette via wParam oder lParam zu senden, indem die Adresse einer Variable angegeben wird. Verwenden Sie dafür den Adressoperator (&). Zum Beispiel:

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

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

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

#Persistent
ListVars
WinWaitActive, ahk_class AutoHotkey
SendMessage, 0x000C, 0, "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 ahk_id 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,,,, ahk_id 0xFFFF  ; 0x001A ist WM_SETTINGCHANGE

Mit OnMessage() kann ein Skript eine Meldung abfangen.

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

Meldungsliste, PostMessage / SendMessage Tutorial, OnMessage(), Winamp automatisieren, DllCall(), ControlSend, WinMenuSelectItem

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
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.
return

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).

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 (US) um.

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

Fragt Winamp, welche Titelnummer gerade 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, Titel Nr. %ErrorLevel% ist aktiv oder wird gerade abgespielt.
}

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

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