Variablen und Ausdrücke

Inhaltsverzeichnis

Variablen

Allgemeine Erläuterungen und Details zur Funktionsweise finden Sie unter Variablen.

Werte in Variablen speichern: Um eine Zeichenkette oder Zahl in eine Variable zu speichern, gibt es zwei Methoden: Altmodisch und Ausdruck. Die altmodische Methode verwendet den Gleichheitszeichenoperator (=), um direkt geschriebene Zeichenketten ohne Anführungszeichen und mit Prozentzeichen umschlossene Variablen zuzuweisen. Zum Beispiel:

MeineZahl = 123
MeineZeichenkette = Das ist eine direkt geschriebene Zeichenkette.
KopieVonVar = %Var%  ; Bei dem Operator "=" sind Prozentzeichen notwendig, um den Inhalt einer Variable abzurufen.

Die Ausdrucksmethode hingegen verwendet den Doppelpunkt-Gleich-Operator (:=), um Zahlen, in Anführungszeichen gesetzte Zeichenketten und andere Arten von Ausdrücken zuzuweisen. Die folgenden Beispiele sind funktional identisch mit den vorherigen Beispielen:

MeineZahl := 123
MeineZeichenkette := "Das ist eine direkt geschriebene Zeichenkette."
KopieVonVar := Var  ; Bei dem Operator ":=" werden Prozentzeichen weggelassen.

Die letztere Methode wird von vielen bevorzugt, weil sie eine Ausdruckssyntax unterstützt, die besser zu verstehen ist und nahezu identisch zur Syntax vieler anderer Sprachen ist.

Mit diesen Methoden kann natürlich auch der Inhalt einer Variable gelöscht werden (um sie sozusagen leer zu machen):

MeineVar =
MeineVar := ""

Die zwei aufeinanderfolgenden Anführungszeichen oben sollten nur mit dem Operator := verwendet werden. Verwendet man stattdessen den Operator =, würde dies dazu führen, dass zwei direkt geschriebene Anführungszeichen in die Variable gespeichert werden.

Inhalte von Variablen abrufen: Es gibt, analog zu den beiden Speichermethoden, auch zwei Methoden, wie man Variablenwerte abrufen kann: Altmodisch und Ausdruck. Bei der altmodischen Methode müssen die Namen der Variablen mit Prozentzeichen umschlossen werden, um ihre Inhalte abzurufen. Zum Beispiel:

MsgBox Der Wert in der Variable namens Var ist %Var%.
KopieVonVar = %Var%

Bei der Ausdrucksmethode hingegen werden die Namen der Variablen nicht mit Prozentzeichen umschlossen und direkt geschriebene Zeichenketten in Anführungszeichen gesetzt. Demnach wären die folgenden Beispiele funktional identisch mit den vorherigen Beispielen:

MsgBox % "Der Wert in der Variable namens Var ist " . Var . "."  ; Mit einem Punkt können zwei Zeichenketten verkettet (verbunden) werden.
KopieVonVar := Var

In der MsgBox-Zeile oben wird ein Prozent- und Leerzeichen verwendet, um den Parameter in den Ausdrucksmodus zu versetzen. Diese Vorgehensweise ist hierbei notwendig, weil nahezu alle Befehlsparameter standardmäßig den altmodischen Modus verwenden, sofern nicht anders dokumentiert.

Variablen vergleichen: Bitte lesen Sie sich den folgenden Abschnitt durch, um zu erfahren, welche Vergleiche es gibt und wann runde Klammern notwendig sind.

Ausdrücke (Expressions)

Eine strukturierte Übersicht und weitere Erläuterungen finden Sie unter Ausdrücke (Expressions).

Ausdrücke sind nützlich, um eine Reihe von Variablen, direkt geschriebenen Zeichenketten und/oder direkt geschriebenen Zahlen zu verarbeiten.

Variablennamen (außer Pseudo-Arrays und andere Doppelreferenzierungen) dürfen innerhalb eines Ausdrucks nicht mit Prozentzeichen umschlossen werden. Folglich müssen direkt geschriebene Zeichenketten in Anführungszeichen gesetzt werden, damit sie nicht als Variablen interpretiert werden. Zum Beispiel:

if (AktuelleEinstellung > 100 or GefundeneFarbe <> "Blau")
    MsgBox Die Einstellung ist zu hoch oder die Farbe ist falsch.

Im obigen Beispiel ist "Blau" in Anführungszeichen gesetzt, weil es sich um eine direkt geschriebene Zeichenkette handelt. Um ein tatsächliches Anführungszeichen in eine direkt geschriebene Zeichenkette einzufügen, gibt man zwei aufeinanderfolgende Anführungszeichen an; zum Beispiel: "Sie sagte: ""Ein Apfel täglich.""".

Wichtig: Der Unterschied einer if-Anweisung mit Ausdruck gegenüber einer traditionelle if-Anweisung wie if GefundeneFarbe <> Blau ist, dass das Zeichen nach dem Wort "if" eine runde Startklammer ist. Obwohl man das für gewöhnlich erreicht, indem man den kompletten Ausdruck mit runden Klammern umschließt, könnte man auch so etwas wie if (x > 0) and (y > 0) schreiben. Darüber hinaus kann man die runde Startklammer weglassen, wenn das erste Element nach dem "if" ein Funktionsaufruf oder ein Operator wie "not" oder "!" ist.

Leere Zeichenketten: Um eine leere Zeichenkette in einem Ausdruck anzugeben, verwendet man zwei aufeinanderfolgende Anführungszeichen. Zum Beispiel wäre die Anweisung if (MeineVar <> "") wahr, wenn MeineVar nicht leer ist. In einer traditionellen if-Anweisung werden zwei aufeinanderfolgende Anführungszeichen jedoch als direkt geschriebener Text behandelt. Zum Beispiel wäre die Anweisung if MeineVar = "" nur wahr, wenn MeineVar tatsächlich zwei Anführungszeichen enthält. Um also zu prüfen, ob eine Variable in einer traditionellen if-Anweisung leer ist, gibt man den Operator = oder <> ohne Vergleichswert an; zum Beispiel: if Var =.

Beachten Sie, dass ungültige Ausdrücke wie (x +* 3) immer eine leere Zeichenkette zurückgeben.

Ergebnis eines Ausdrucks speichern: Um das Ergebnis eines Ausdrucks einer Variable zuzuweisen, nutzt man den Operator :=. Zum Beispiel:

Nettopreis := Preis * (1 - Rabatt/100)

Boolesche Werte: Das Ergebnis eines Ausdrucks (z. B. einer IF-Anweisung) ist falsch (False), wenn es leer oder 0 ist, oder wahr (True), wenn ein anderes Ergebnis vorliegt. Zum Beispiel wäre die Anweisung if ItemCount nur dann falsch, wenn ItemCount leer oder 0 ist. Der Ausdruck if not ItemCount würde das gegenteilige Ergebnis liefern.

Operatoren wie NOT/AND/OR/>/=/< erzeugen automatisch einen wahren oder falschen Wert: 1 für True und 0 für False. Im folgenden Beispiel bekommt die Done-Variable eine 1 zugewiesen, wenn eine der beiden Bedingungen wahr ist:

Done := A_Index > 5 or FoundIt

Wie oben angedeutet, kann eine Variable zum Speichern eines falschen Wertes verwendet werden, indem man sie leer macht oder ihr eine 0 zuweist. Verwenden Sie dann die Kurzanweisung if Done, um zu überprüfen, ob die Done-Variable wahr oder falsch ist.

Die Wörter True und False sind interne Variablen, die 1 und 0 enthalten. Sie können verwendet werden, um ein Skript besser lesbar zu machen, z. B.:

GroßKleinSensitiv := false
SucheFortsetzen := true

Integer (ganze Zahlen) und Floating-Point-Zahlen (Gleitkommazahlen): Zahlen, die einen Dezimalpunkt enthalten, werden innerhalb eines Ausdrucks als Floating-Point-Zahlen gewertet; alle anderen Zahlen werden als Integer behandelt. Bei den meisten Operatoren -- wie Addition und Multiplikation -- gilt: Wenn einer der Eingabewerte eine Floating-Point-Zahl ist, wird das Ergebnis auch eine Floating-Point-Zahl sein.

Innerhalb und außerhalb von Ausdrücken können Integer sowohl im hexadezimalen als auch dezimalen Format geschrieben werden. Hexadezimalzahlen beginnen mit dem 0x-Präfix. Zum Beispiel wäre Sleep 0xFF das gleiche wie Sleep 255. [v1.0.46.11+]: Floating-Point-Zahlen in wissenschaftlicher Schreibweise werden erkannt; aber nur, wenn sie einen Dezimalpunkt enthalten (z. B. 1.0e4 und -2.1E-4).

Einen Ausdruck erzwingen: Standardmäßig unterstützen Befehlsparameter (außer AusgabeVar-Parameter) keine Ausdrücke, aber man kann mithilfe eines Prozentzeichens und Leer- oder Tabulatorzeichens ein Ausdruck in einem Parameter erzwingen. In [v1.1.21+] kann dieses Präfix in den EingabeVar-Parametern von fast allen Befehlen verwendet werden; benutzen Sie für die traditionellen IF-Befehlen stattdessen If (Ausdruck). Diese Technik wird häufig genutzt, um auf Arrays zuzugreifen. Zum Beispiel:

FileAppend, % MeinArray[i], Meine Datei.txt
FileAppend, % MeinPseudoArray%i%, Meine Datei.txt
MsgBox % "Die MeineVar-Variable enthält " . MeineVar . "."
Loop % Iterationen + 1
WinSet, Transparent, % X + 100
Control, Choose, % AktuelleAuswahl - 1

Operatoren innerhalb von Ausdrücken

Allgemeine Informationen über Operatoren finden Sie unter Operatoren.

Sofern nicht anders unten angegeben, werden leere Werte (leere Zeichenketten) oder nicht-numerische Werte innerhalb einer mathematischen Operation nicht als 0 interpretiert. Stattdessen werden sie als Fehler behandelt, was dazu führt, dass dieser Teil des Ausdrucks als leere Zeichenkette gewertet wird. Wenn die Variable X zum Beispiel leer wäre, würde der Ausdruck X+1 einen leeren Wert statt 1 zurückgeben.

Aus historischen Gründen werden in Anführungszeichen gesetzte numerische Zeichenketten wie "123" immer als nicht-numerisch angesehen, wenn sie direkt in einem Ausdruck verwendet werden (aber nicht, wenn sie in eine Variable gespeichert oder von einer Funktion zurückgegeben werden). Dieser nicht-numerische Attribut kann mit einer Verkettung erzwungen werden, um Ausdrücke wie "0x" n einen nicht-numerischen Wert erzeugen zu lassen (auch wenn n gültige hexadezimale Ziffern enthalten sollte). Dieses Problem kann man umgehen, indem man den Wert in eine Variable speichert oder ihn via Funktion, wie z. B. Round(), übergibt. Generell sollte man vermeiden, direkt geschriebene Zahlen in Anführungszeichen zu setzen, weil dieses Verhalten eventuell in einer zukünftigen Version geändert wird.

Ausdrucksoperatoren (in absteigender Priorität)

%Var%

Umschließt man innerhalb eines Ausdrucks eine Variable mit Prozentzeichen (z. B. %Var%), wird alles, was in dieser Variable enthalten ist, als Name oder Teilname einer anderen Variable angesehen (wenn es diese Variable nicht gibt, wird %Var% in eine leere Zeichenkette aufgelöst). Meistens wird das verwendet, um auf Elemente eines Pseudo-Arrays zu verweisen, wie z. B:

Var := MeinArray%A_Index% + 100

Aus Gründen der Abwärtskompatibilität ignorieren Befehlsparameter, die als "kann ein Ausdruck sein" dokumentiert sind, die Prozentzeichen bei einem alleinstehenden Namen, der von Prozentzeichen umschlossen ist (z. B. %Var%, aber nicht Array%i%). Um das zu umgehen, umschließt man die Referenz mit runden Klammern; z. B. Sleep (%Var%).

[AHK_L 52+]: Zusätzlich zu den normalen Variablen kann %Var% in eine Umgebungsvariable, die Zwischenablage oder eine reservierte/nur lesbare Variable aufgelöst werden. Vor Revision 52 wurde %Var% in solchen Fällen in eine leere Zeichenkette aufgelöst.

x.y [AHK_L 31+]: Objektzugriff. Ruft einen Wert ab, setzt einen Wert oder ruft eine Methode des Objekts x auf. Hierbei ist y ein direkt geschriebener Wert. Siehe Objektsyntax.
new [v1.1.00+]: Erstellt ein neues von einem anderen Objekt abgeleitetes Objekt. Zum Beispiel wäre x := new y generell das gleiche wie x := {base: y}. Nach dem Wort new sollte eine Variable oder ein einfacher Klassenname in Form von GlobaleKlasse.VerschachtelteKlasse erfolgen, und je nach Bedarf Parameter wie in x := new y(z) (hierbei ist y kein Funktionsname, sondern eine Variable). Weitere Informationen finden Sie unter Benutzerdefinierte Objekte.
++
--
Vorherige und nachherige Inkrementierung/Dekrementierung. Erhöht oder verringert eine Zahlenvariable um 1 (in den Versionen vor 1.0.46 müssen sie allein auf einer Zeile stehen; es dürfen keine anderen Operatoren vorhanden sein). Der Operator kann entweder vor oder nach dem Namen einer Variable erfolgen. Erfolgt der Operator vor dem Namen, wird die Operation sofort durchgeführt und ihr Ergebnis für die nächste Operation verwendet. Zum Beispiel würde Var := ++X die X-Variable sofort um 1 erhöhen und ihr Wert in Var speichern. Erfolgt der Operator nach dem Namen einer Variable, wird die Operation erst durchgeführt, wenn die Variable für die nächste Operation verwendet wurde. Zum Beispiel würde Var := X++ die X-Variable erst um 1 erhöhen, wenn der aktuelle Wert von X in Var gespeichert wurde. Aus Gründen der Abwärtskompatibilität behandeln diese Operatoren leere Variablen als 0, sofern sie allein auf einer Zeile stehen; zum Beispiel würde sowohl y := 1, ++x als auch MsgBox % ++x ein leeres Ergebnis erzeugen, wenn x leer ist.
**

Potenz. Sowohl die Basis als auch der Exponent können einen Dezimalpunkt enthalten. Ist der Exponent negativ, wird das Ergebnis in eine Floating-Point-Zahl umgewandelt, auch dann, wenn Basis und Exponent Integer sind. Da dieser Operator eine höhere Priorität hat als ein unäres Minuszeichen, wird -2**2 wie -(2**2) ausgewertet und daher -4 zurückgeben. Um also eine direkt geschriebene negative Zahl zu potenzieren, muss sie in runden Klammern gesetzt werden, z. B (-2)**2 .

Hinweis: Eine negative Basis in Verbindung mit einem gebrochenen Exponenten wie (-2)**0.5 wird nicht unterstützt; das Ergebnis wird eine leere Zeichenkette sein. Schreibweisen wie (-2)**2 und (-2)**2.0 werden aber unterstützt.

-
!
~
& *

Unäres Minuszeichen (-): Obwohl dieser Operator und der Subtraktionsoperator dasselbe Symbol verwenden, wird das unäre Minuszeichen nur auf ein einzelnes Element oder einen Teilausdruck angewendet; zum Beispiel: -(3 / -x). Unäre Pluszeichen (+) werden hingegen in einem Ausdruck ignoriert.

Logisches NICHT (!): Wenn dieser Operator bei einem Operanden angewendet wird, der leer oder 0 ist, ist das Ergebnis eine 1 (true). Ansonsten ist das Ergebnis eine 0 (false). Zum Beispiel: !x or !(y and z). Hinweis: Das Wort NOT ist das gleiche wie !, allerdings hat ! eine höhere Priorität. [v1.0.46+]: Aufeinanderfolgende unäre Operatoren wie !!Var sind erlaubt, weil sie von rechts nach links ausgewertet werden.

Bitweises NICHT (~): Dieser Operator invertiert jedes Bit seines Operanden. Handelt es sich bei den Operanden um eine Floating-Point-Zahl, wird er vor der Berechnung auf Integer-Größe gekürzt. Ist der Operand eine Zahl zwischen 0 und 4294967295 (0xffffffff), wird er als vorzeichenloser 32-Bit-Wert behandelt. Ansonsten wird er als vorzeichenfähiger 64-Bit-Wert behandelt. Zum Beispiel wäre ~0xf0f dann 0xfffff0f0 (4294963440).

Adresse (&): &MeineVar ruft die Adresse des Inhalts von MeineVar im Speicher ab, was häufig in Verbindung mit DllCall-Strukturen genutzt wird. &MeineVar deaktiviert außerdem das Caching von Binärzahlen in dieser Variable, was sich negativ auf ihre Performance auswirken kann, wenn sie Teil einer Berechnung oder eines numerischen Vergleichs ist. Sobald sich die Adresse einer Variable ändert, wird das Caching wieder aktiviert (z. B. via VarSetCapacity()).

Dereferenzierung (*): *Ausdruck geht davon aus, dass sich Ausdruck in eine numerische Speicheradresse auflöst; es wird versucht, das Byte auf dieser Adresse als Zahl im Bereich von 0 und 255 abzurufen (wenn die Adresse 0 ist, wird immer 0 abgerufen; jede andere ungültige Adresse sollte man vermeiden, da sie das Skript zum Absturz bringen könnte). Beachten Sie, dass NumGet() in der Regel eine deutlich bessere Performance erzielt, wenn es darum geht, binäre Zahlen abzurufen.

*
/
//

Multiplizieren (*): Das Ergebnis ist ein Integer, wenn beide Eingabewerte Integer sind; ansonsten ist es eine Floating-Point-Zahl.

Echtes Dividieren (/): Im Gegensatz zu EnvDiv liefert die echte Division immer eine Floating-Point-Zahl, auch dann, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 3/2 gleich 1.5 statt 1, und 4/2 gleich 2.0 statt 2.

Floor-Dividieren (//): Der Doppelschrägstrich-Operator verwendet eine sehr performante Integer-Division, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 5//3 gleich 1 und 5//-3 gleich -1. Wenn einer der beiden Eingabewerte eine Floating-Point-Zahl ist, wird eine Floating-Point-Division durchgeführt und das Ergebnis auf den am nächsten links befindlichen Integer gekürzt. Zum Beispiel wäre 5//3.0 gleich 1.0 und 5.0//-3 gleich -2.0. Obwohl das Ergebnis dieser Floating-Point-Division ein Integer ist, wird es in nachfolgenden Operationen als Floating-Point-Zahl behandelt. Um stattdessen eine Division mit Rest (Modulo) durchzuführen, siehe Mod().

Die Operatoren *= und /= sind Kurzschreibweisen zum Multiplizieren oder Dividieren eines Variablenwertes mit einem anderen Wert. Var *= 2 liefert zum Beispiel das gleiche Ergebnis wie Var := Var * 2 (allerdings ist die erste Schreibweise performanter).

Eine Division durch 0 liefert ein leeres Ergebnis (leere Zeichenkette).

+
-

Addieren (+) und Subtrahieren (-). Die Operatoren += und -= sind Kurzschreibweisen zum Erhöhen oder Verringern eines Variablenwertes um einen beliebigen Wert. Var += 2 liefert zum Beispiel das gleiche Ergebnis wie Var := Var + 2 (allerdings ist die erste Schreibweise performanter). Desweiteren gibt es die Möglichkeit, eine Variable mit Var++, Var--, ++Var oder --Var schrittweise um 1 zu erhöhen oder zu verringern.

<<
>>
Bitweise Verschiebung nach links (<<) und nach rechts (>>). Anwendungsbeispiel: Wert1 << Wert2. Jeder Floating-Point-Eingabewert wird vor der Berechnung auf einen Integer gekürzt. Die bitweise Verschiebung nach links (<<) wäre das gleiche wie, als würde man Wert1 mit "2, potenziert um Wert2" multiplizieren. Die bitweise Verschiebung nach rechts (>>) wäre das gleiche wie, als würde man Wert1 mit "2, potenziert um Wert2" dividieren und dann das Ergebnis auf den am nächsten links befindlichen Integer runden; zum Beispiel wäre -3>>1 gleich -2.
&
^
|
Bitweises UND (&), bitweises exklusives ODER (^) und bitweises ODER (|). Von diesen drei Operatoren hat & die höchste Priorität und | die niedrigste Priorität. Jeder Floating-Point-Eingabewert wird vor der Berechnung auf einen Integer gekürzt.
.

Verkettung. Mit dem Punkt-Operator können zwei Elemente kombiniert werden, um eine einzelne Zeichenkette zu erhalten (auf beiden Seiten des Punktes muss mindestens ein Leerzeichen vorhanden sein). Dasselbe Ergebnis kann auch ohne diesen Punkt erzielt werden (außer bei Zweideutigkeiten wie x -y, oder wenn das rechts befindliche Element ein ++ oder -- davor hat). Fehlt der Punkt, müssen die Elemente, die zusammengeführt werden sollen, mit mindestens einem Leerzeichen getrennt werden.
Beispiel (Ausdrucksmethode): Var := "Die Farbe ist " . GefundeneFarbe
Beispiel (traditionelle Methode): Var = Die Farbe ist %GefundeneFarbe%

Teilausdrücke können auch verkettet werden. Zum Beispiel: Var := "Der Nettopreis ist " . Preis * (1 - Rabatt/100).

Eine Zeile, die mit einem Punkt (oder einem anderen Operator) beginnt, wird automatisch mit der darüberliegenden Zeile verbunden.

~= [AHK_L 31+]: Kurzschreibweise für RegExMatch. "abc123" ~= "\d" beispielsweise würde ErrorLevel auf 0 setzen und eine 4 liefern (die Position des ersten numerischen Zeichens). Früher vor [v1.1.03] war es so, dass dieser Operator und der Gleichheitsoperator (=) die gleiche Priorität hatten und unvollständig dokumentiert war.
>   <
>= <=
Größer (>), kleiner (<), größer gleich (>=) und kleiner gleich (<=). Wenn einer der beiden Eingabewerte keine Zahl ist, werden sie alphabetisch verglichen (eine in Anführungszeichen gesetzte Zeichenkette wie "55" gilt in diesem Zusammenhang immer als nicht-numerisch). Der Vergleich ist nur Groß-/Kleinschreibung-sensitiv, wenn StringCaseSense eingeschaltet ist. Siehe auch: Sort
=
==
<> !=

Gleich (=), Groß-/Kleinschreibung-sensitiv gleich (==) und ungleich (<> oder !=). Die Operatoren != und <> sind funktional identisch. Die Operatoren == und = verhalten sich gleich, wenn beide Eingabewerte numerisch sind. Sobald aber einer der Eingabewerte nicht numerisch ist, ist == immer Groß-/Kleinschreibung-sensitiv und = immer nicht-Groß-/Kleinschreibung-sensitiv (die Methode der Nicht-Sensitivität ist abhängig von StringCaseSense). Die Operatoren <> und != berücksichtigen hingegen StringCaseSense.

Hinweis: Eine in Anführungszeichen gesetzte Zeichenkette wie "55" gilt in diesem Zusammenhang immer als nicht-numerisch.

Veraltet: Der Operator <> ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen den Operator !=.

NOT Logisches NICHT. Abgesehen von seiner geringeren Priorität ist dieser Operator funktional identisch mit dem !-Operator. not (x = 3 or y = 3) wäre zum Beispiel das gleiche wie !(x = 3 or y = 3).
AND
&&
Beide Operatoren sind ein logisches UND. Zum Beispiel: x > 3 and x < 10. Zur Verbesserung der Performance wird die Kurzschlussauswertung angewendet. Eine Zeile, die mit AND/OR/&&/|| (oder einem anderen Operator) beginnt, wird automatisch mit der darüberliegenden Zeile verbunden.
OR
||
Beide Operatoren sind ein logisches ODER. Zum Beispiel: x <= 3 or x >= 10. Zur Verbesserung der Performance wird die Kurzschlussauswertung angewendet.
?: Ternärer Operator [v1.0.46+]. Dieser Operator ist eine Kurzschreibweise zum Durchführen einer if-else-Anweisung. Der Operator wertet die Bedingung auf der linken Seite aus, um festzustellen, welche der beiden Verzweigungen als Endergebnis dienen soll. Var := x>y ? 2 : 3 beispielsweise würde eine 2 in Var speichern, falls x größer als y ist; ansonsten würde es eine 3 speichern. Zur Verbesserung der Performance wird nur die gewinnende Verzweigung ausgewertet (siehe Kurzschlussauswertung).
:=
+=
-=
*=
/=
//=
.=
|=
&=
^=
>>=
<<=

Zuweisung. Führt eine Operation auf den Inhalt einer Variable aus und speichert das Ergebnis wieder in die gleiche Variable (früher vor v1.0.46 konnten sie nur als am weitesten links befindlicher Operator auf einer Zeile verwendet werden, außerdem wurden nur die ersten fünf Operatoren unterstützt). Der einfachste Zuweisungsoperator ist der Doppelpunkt-Gleich-Operator (:=), der das Ergebnis eines Ausdrucks in eine Variable speichert. Eine Beschreibung dessen, was die anderen Operatoren tun, finden Sie in den entsprechenden Einträgen dieser Tabelle. Var //= 2 beispielsweise führt eine Floor-Division durch, um Var durch 2 zu teilen, und speichert dann das Ergebnis wieder in Var. Ein weiteres Beispiel ist Var .= "abc", was die Kurzschreibweise für Var := Var . "abc" wäre.

Im Gegensatz zu den meisten anderen Operatoren werden Zuweisungen von rechts nach links ausgewertet. Eine Zeile wie Var1 := Var2 := 0 würde also erst eine 0 in Var2 speichern und dann Var2 in Var1 speichern.

Verwendet man eine Zuweisung im Eingabewert eines anderen Operators, wird die Variable selbst als Eingabewert genommen. Der Ausdruck (Var += 2) > 50 wäre beispielsweise wahr, wenn der gerade eben erhöhte Wert in Var größer als 50 ist. Eine auf diese Weise verwendete Zuweisung kann auch via Referenz (ByRef) übergeben werden, oder ihre Adresse zurückgeben; zum Beispiel: &(x:="abc").

Die Priorität der Zuweisungsoperatoren erhöht sich automatisch, wenn dadurch ein Syntaxfehler verhindert oder ein besseres Verhalten bereitgestellt werden kann. Zum Beispiel: not x := y würde als not (x := y) ausgewertet werden. ++Var := X würde als ++(Var := X) ausgewertet werden; und Z > 0 ? X := 2 : Y := 2 würde als Z > 0 ? (X := 2) : (Y := 2) ausgewertet werden.

Bekannte Einschränkungen durch Abwärtskompatibilität (die eventuell in einer zukünftigen Version behoben werden): 1) Wenn /= der am weitesten links befindliche Operator in einem Ausdruck ist und nicht zu einer Mehrfachanweisung gehört, führt dieser Operator eine Floor-Division durch, es sei denn, einer der Eingabewerte ist eine Floating-Point-Zahl (in allen anderen Fällen führt /= eine echte Division durch); 2) Datum/Zeit-Berechnung mit += und -= ist nur möglich, wenn dieser Operator der am weitesten links befindliche Operator auf der Zeile ist; 3) Die Operatoren +=, -= und *= behandeln leere Variablen als 0, aber nur, wenn sie einzeln auf einer Zeile stehen; y := 1, x += 1 und MsgBox % x -= 3 würden beispielsweise ein leeres Ergebnis erzeugen, falls x leer ist.

,

Komma (Mehrfachanweisung) [v1.0.46+]. Kommas können genutzt werden, um mehrere Teilausdrücke auf einer Zeile zu schreiben. Diese Vorgehensweise wird häufig angewendet, um mehrere Zuweisungen oder Funktionsaufrufe zu gruppieren. Zum Beispiel: x:=1, y+=2, ++index, MeineFunk(). Solche Anweisungen werden von links nach rechts ausgeführt.

Hinweis: Eine Zeile, die mit einem Komma (oder einem anderen Operator) beginnt, wird automatisch mit der darüberliegenden Zeile verbunden. Siehe auch: Komma-Performance.

[v1.0.46.01+]: Wenn direkt nach einem Komma eine Variable und ein Gleichheitszeichen erfolgt, wird das Gleichheitszeichen automatisch als Zuweisung (:=) behandelt. Alle Teilausdrücke in der folgenden Mehrfachanweisung sind beispielsweise Zuweisungen: x:=1, y=2, a=b=c. Neue Skripte sollten sich nicht auf dieses Verhalten verlassen, weil es eventuell noch geändert wird. Diese Regel gilt nur für reine Variablen und nicht für Doppeldereferenzierungen; die folgende Mehrfachanweisung enthält beispielsweise nur eine Zuweisung: x:=1, %y%=2

Die folgenden Arten von Teilausdrücken überschreiben die Priorität bzw. die Reihenfolge der Auswertung:

(Ausdruck)

Ein beliebiger in Klammern gesetzter Teilausdruck. (3 + 2) * 2 beispielsweise würde zuerst 3 + 2 auswerten.

mod()
round()
abs()

Funktionsaufruf. Direkt nach dem Funktionsnamen muss eine runde Startklammer erfolgen; das heißt, dass keine Leer- oder Tabulatorzeichen zwischen dem Namen und der Klammer erlaubt sind. Einzelheiten finden Sie unter Funktionen.

%func%()

Siehe Dynamisches Aufrufen einer Funktion.
func.()

Veraltet: Diese Syntax wird nicht empfohlen. Benutzen Sie stattdessen %func%() (für Funktionsnamen und Objekte) oder func.Call() (für Funktionsobjekte).

[AHK_L 48+]: Versucht, eine namenlose Methode des Objekts func aufzurufen. Gemäß der Konvention ist das die "Standardmethode" des Objekts. Wenn func kein Objekt enthält, wird stattdessen das Standard-Base-Objekt aufgerufen.

[v1.0.95+]: Enthält func einen Funktionsnamen, wird die benannte Funktion aufgerufen.

Fn(Params*)

[AHK_L 60+]: Variadischer Funktionsaufruf. Params ist ein Array (Objekt), das Parameterwerte enthält.

x[y]
[a, b, c]

[AHK_L 31+]: Zugriff auf Objektelemente. Ruft einen Wert ab, setzt einen Wert oder ruft eine Methode des Objekts x auf. Hierbei ist y eine Parameterliste oder ein Ausdruck, der einen Methodennamen zurückgibt.

[v1.0.97+]: Direkte Array-Schreibweise. Wenn die eckige Startklammer keinen Wert (oder Teilausdruck, der einen Wert zurückgibt) davor hat, wird die Klammer als Beginn eines direkt geschriebenen Arrays interpretiert. [a, b, c] beispielsweise ist das gleiche wie Array(a, b, c) (a, b und c sind Variablen).

Weitere Informationen finden Sie unter Array-Syntax und Objektsyntax.

{a: b, c: d}

[v1.0.97+]: Direkte Objekt-Schreibweise. Erstellt ein Objekt oder assoziatives Array. x := {a: b} beispielsweise ist das gleiche wie x := Object("a", b) oder x := Object(), x.a := b. Weitere Informationen finden Sie unter Assoziative Arrays.


Performance: [v1.0.48+]: Ausdrücke, die mit einem Komma getrennt werden, sind performanter als einzeln geschriebene Ausdrücke, besonders wenn es darum geht, eine Variable in eine andere Variable zu speichern (z. B. x := y, a := b). Je mehr Ausdrücke zu einem einzigen Ausdruck zusammengefasst werden, desto höher ist die Performance; zum Beispiel könnte man ein Geschwindigkeitszuwachs von 35 % erreichen, wenn man fünf oder zehn einfache Ausdrücke zu einem Ausdruck kombiniert.

Interne Variablen

Die folgenden Variablen sind fest in das Programm integriert und normal abrufbar.

Allgemeine Informationen finden Sie unter Interne Variablen.

Inhaltsverzeichnis

Sonderzeichen

A_Space Diese Variable enthält ein einzelnes Leerzeichen. Siehe AutoTrim für weitere Details.
A_Tab Diese Variable enthält ein einzelnes Tabulatorzeichen. Siehe AutoTrim für weitere Details.

Skript-Eigenschaften

1, 2, 3, etc. Diese Variablen werden automatisch erstellt, wenn ein Skript mit Befehlszeilenparametern gestartet wird. Sie können wie normale Variablennamen geändert oder abgerufen werden (zum Beispiel: %1%), aber nicht direkt in einem Ausdruck verwiesen werden. Die Variable %0% enthält die Anzahl der Parameter, die übergeben worden sind (0 wenn keine). Einzelheiten finden Sie unter Befehlszeilenparameter.
A_Args
[v1.1.27+]
Liest/Schreibt einen Array mit Befehlszeilenparametern. Weitere Informationen finden Sie unter Befehlszeilenparameter an ein Skript übergeben.
A_WorkingDir Das aktuelle Arbeitsverzeichnis, von wo aus das Skript standardmäßig auf Dateien zugreift. Der letzte umgekehrte Schrägstrich ist nicht enthalten, es sei denn, es handelt sich um das Stammverzeichnis. Zwei Beispiele: C:\ und C:\Meine Dokumente. Mit SetWorkingDir kann das Arbeitsverzeichnis geändert werden.
A_ScriptDir Der vollständige Pfadname des Verzeichnisses, wo sich das aktuelle Skript befindet. Der letzte umgekehrte Schrägstrich wird weggelassen (auch bei Stammverzeichnissen).
A_ScriptName Der Dateiname des aktuellen Skripts, ohne Pfad, z. B. MeinSkript.ahk.
A_ScriptFullPath Eine Kombination der beiden oberen Variablen bzw. der vollständige Pfadname des Skripts, z. B. C:\Meine Dokumente\MeinSkript.ahk
A_ScriptHwnd
[v1.1.01+]
Die Eindeutige ID (HWND/Handle) des versteckten Skript-Hauptfensters.
A_LineNumber

Die Nummer der aktuell ausgeführten Zeile innerhalb des Skripts (oder innerhalb einer #Include-Datei, sofern angegeben). Diese Zeilennummer stimmt mit der angezeigten Zeilennummer in ListLines überein; diese Variable ist zum Beispiel nützlich, um einen Fehler zu melden: MsgBox, Eine Zeile konnte nicht in die Log-Datei geschrieben werden (Zeilennummer %A_LineNumber%)

Da beim Kompilieren eines Skripts alle #Include-Dateien zusammengefügt werden, sind die Zeilen eventuell anders nummeriert als im nicht-kompilierten Modus.

A_LineFile Der vollständige Pfadname der Datei, auf der sich A_LineNumber bezieht, und prinzipiell das gleiche ist wie A_ScriptFullPath, es sei denn, die Zeile gehört zu einer #Include-Datei eines nicht-kompilierten Skripts.
A_ThisFunc
[v1.0.46.16+]
Der Name der benutzerdefinierten Funktion, die gerade ausgeführt wird (ansonsten leer); zum Beispiel: MeineFunktion. Siehe auch: IsFunc()
A_ThisLabel
[v1.0.46.16+]
Der Name des Labels (Subroutine), das gerade ausgeführt wird (ansonsten leer); zum Beispiel: MeinLabel. Diese Variable wird jedes Mal aktualisiert, wenn das Skript Gosub/Return oder Goto ausführt. Sie wird auch aktualisiert, wenn ein Label automatisch durch Timer, GUI-Threads, Menüpunkte, Hotkeys, Hotstrings, OnClipboardChange (Label) und OnExit aufgerufen wird. A_ThisLabel wird jedoch nicht aktualisiert, wenn die Skriptausführung in eines der oben genannten Label "hineinfällt"; in diesem Fall behält A_ThisLabel ihren vorherigen Wert. Siehe auch: A_ThisHotkey und IsLabel()
A_AhkVersion In den Versionen vor 1.0.22 ist diese Variable leer. A_AhkVersion enthält die Version des AutoHotkey-Programms, mit dem das Skript ausgeführt wird, z. B. 1.0.22. Wird diese Variable in einem kompilierten Skript verwendet, meldet sie die Version des AutoHotkey-Programms, mit der das Skript ursprünglich kompiliert wurde. Aufgrund der Struktur der Versionsnummer kann ein Skript mithilfe von ">" oder ">=" überprüfen, ob A_AhkVersion größer als eine bestimmte Versionsnummer ist. Zum Beispiel: if A_AhkVersion >= 1.0.25.07.
A_AhkPath

Bei nicht-kompilierten Skripten: Der vollständige Pfadname der EXE-Datei, mit der das aktuelle Skript gerade ausgeführt wird. Zum Beispiel: C:\Program Files\AutoHotkey\AutoHotkey.exe

Bei kompilierten Skripten: Das gleiche wie oben, allerdings wird das AutoHotkey-Verzeichnis mithilfe des Registry-Eintrags HKLM\SOFTWARE\AutoHotkey\InstallDir ermittelt. Wenn dieser Eintrag nicht gefunden wird, ist A_AhkPath leer.

A_IsUnicode

Enthält 1, wenn Zeichenketten im Unicode-Format (16-Bit) sind, oder eine leere Zeichenkette (das als falsch angesehen wird), wenn Zeichenketten im ANSI-Format (8-Bit) sind. Das Format der Zeichenketten ist abhängig davon, mit welcher AutoHotkey-Version das Skript ausgeführt wird oder mit welcher BIN-Datei es kompiliert wurde.

Bei ANSI-basierten Ausführungsdateien vor [v1.1.06] blieb A_IsUnicode undefiniert; das heißt, dass das Skript dieser Variable einen Wert zuweisen konnte und dass der Versuch, sie zu lesen, eine UseUnsetGlobal-Warnung auslösen konnte. In späteren Versionen ist sie immer definiert und schreibgeschützt.

A_IsCompiled

Enthält 1, wenn das Skript als kompilierte EXE-Datei ausgeführt wird, oder eine leere Zeichenkette (das als falsch angesehen wird), wenn das nicht der Fall ist.

Bei nicht-kompilierten Skripten vor [v1.1.06] blieb A_IsCompiled undefiniert; das heißt, dass das Skript dieser Variable einen Wert zuweisen konnte und dass der Versuch, sie zu lesen, eine UseUnsetGlobal-Warnung auslösen konnte. In späteren Versionen ist sie immer definiert und schreibgeschützt.

A_ExitReason Der aktuellste Grund, warum das Skript beendet werden soll. Diese Variable enthält nur einen Wert, wenn eine OnExit-Subroutine des Skripts gerade läuft oder durch einen Exitversuch mindestens einmal aufgerufen wurde. Siehe OnExit für weitere Details.

Datum und Zeit

A_YYYY

Das aktuelle 4-stellige Jahr (z. B. 2004). A_Year enthält denselben Wert.

Hinweis: Um die Uhrzeit oder das Datum in einem Format darzustellen, das dem Gebietsschema und der Sprache des aktuellen Benutzers entspricht, verwendet man FormatTime, AusgabeVar (Zeit und langes Datum) oder FormatTime, AusgabeVar,, LongDate (ermittelt ein Datum im langen Format).

A_MM Der aktuelle 2-stellige Monat (01-12). A_Mon enthält denselben Wert.
A_DD Der aktuelle 2-stellige Tag des Monats (01-31). A_MDay enthält denselben Wert.
A_MMMM Der aktuelle vollständige Monatsname in der aktuellen Sprache des Benutzers, z. B. Juli
A_MMM Der aktuelle abgekürzte Monatsname in der aktuellen Sprache des Benutzers, z. B. Jul
A_DDDD Der aktuelle vollständige Wochentagsname in der aktuellen Sprache des Benutzers, z. B. Sonntag
A_DDD Der aktuelle abgekürzte Wochentagsname in der aktuellen Sprache des Benutzers, z. B. So
A_WDay Der aktuelle 1-stellige Wochentag (1-7). 1 ist Sonntag in allen Gebietsschemen.
A_YDay Der aktuelle Tag im Jahr (1-366). Der Wert enthält keine führenden Nullen, z. B. wird 9 abgerufen, nicht 009. Das folgende Beispiel zeigt, wie ein Wert mit führenden Nullen abgerufen werden kann: FormatTime, AusgabeVar, , YDay0.
A_YWeek Das aktuelle Jahr und Wochennummer (z. B. 200453) gemäß ISO 8601. Um das Jahr von der Woche zu trennen, verwendet man StringLeft, Jahr, A_YWeek, 4 und StringRight, Woche, A_YWeek, 2. Genaue Definition von A_YWeek: Wenn die Woche mit dem 1. Januar mindestens vier Tage im neuen Jahr hat, ist sie Woche 1. Ansonsten ist sie die letzte Woche des vorherigen Jahres, und die nachfolgende Woche die erste Woche des neuen Jahres.
A_Hour Die aktuelle 2-stellige Stunde (00-23) im 24-Stunden-Format. Das folgende Beispiel zeigt, wie die Zeit im 12-Stunden-Format mit den Indikatoren AM bzw. PM abgerufen werden kann: FormatTime, AusgabeVar, , h:mm:ss tt
A_Min

Die aktuelle 2-stellige Minute (00-59).

A_Sec Die aktuelle 2-stellige Sekunde (00-59).
A_MSec Die aktuelle 3-stellige Millisekunde (000-999). Das folgende Beispiel zeigt, wie die führenden Nullen entfernt werden können: Millisekunden := A_MSec + 0.
A_Now

Die aktuelle Ortszeit im YYYYMMDDHH24MISS-Format.

Hinweis: Datums- und Zeitberechnungen können mit EnvAdd und EnvSub durchgeführt werden. Außerdem kann FormatTime genutzt werden, um das Datum und/oder die Uhrzeit in einem Format darzustellen, das dem Gebietsschema oder den Präferenzen des aktuellen Benutzers entspricht.

A_NowUTC Die aktuelle koordinierte Weltzeit (Coordinated Universal Time oder kurz UTC) im YYYYMMDDHH24MISS-Format. UTC ist grundsätzlich das gleiche wie Greenwich Mean Time (GMT).
A_TickCount

Die Zeit in Millisekunden, die seit dem Systemstart verstrichen ist. Um diese verstrichene Zeit zu messen, speichert man A_TickCount in eine Variable und zieht sie später vom aktuellen A_TickCount-Wert ab. Zum Beispiel:

Startzeit := A_TickCount
Sleep, 1000
VerstricheneZeit := A_TickCount - Startzeit
MsgBox,  %VerstricheneZeit% Millisekunden sind verstrichen.

Schauen Sie sich QueryPerformanceCounter() an, wenn Sie eine höhere Genauigkeit als die 10 ms von A_TickCount benötigen.

Skript-Einstellungen

A_IsSuspended Enthält 1, wenn das Skript via Suspend gesperrt ist, ansonsten 0.
A_IsPaused
[v1.0.48+]
Enthält 1, wenn der Thread direkt unterhalb des aktuellen Threads pausiert ist. Ansonsten ist eine 0 enthalten.
A_IsCritical
[v1.0.48+]
Enthält 0, wenn Critical im aktuellen Thread ausgeschaltet ist. Ansonsten enthält A_IsCritical einen Integer größer als 0 bzw. die von Critical verwendete Meldungsüberprüfungsfrequenz. Critical 0 schaltet den kritischen Status eines Threads aus. Um demzufolge den aktuellen Status von Critical zu speichern und wiederherzustellen, nutzt man Alt_IsCritical := A_IsCritical und später Critical %Alt_IsCritical%.
A_BatchLines (oder A_NumBatchLines) Der aktuell gesetzte Wert von SetBatchLines. Beispiele: 200 oder 10ms (je nach Format).
A_ListLines
[v1.1.28+]
Enthält 1, wenn ListLines eingeschaltet ist. Ansonsten ist eine 0 enthalten.
A_TitleMatchMode Der aktuell gesetzte Modus von SetTitleMatchMode: 1, 2, 3 oder RegEx.
A_TitleMatchModeSpeed Die aktuell gesetzte Übereinstimmungsgeschwindigkeit (fast oder slow) von SetTitleMatchMode.
A_DetectHiddenWindows Der aktuell gesetzte Modus (On oder Off) von DetectHiddenWindows.
A_DetectHiddenText Der aktuell gesetzte Modus (On oder Off) von DetectHiddenText.
A_AutoTrim Der aktuell gesetzte Modus (On oder Off) von AutoTrim.
A_StringCaseSense Der aktuell gesetzte Modus (On, Off oder Locale) von StringCaseSense.
A_FileEncoding [AHK_L 46+]: Enthält die von verschiedenen Befehlen standardmäßig genutzte Codierung; siehe FileEncoding.
A_FormatInteger Das aktuell gesetzte Integer-Format (H oder D) von SetFormat. [AHK_L 42+]: Kann auch ein kleines h enthalten.
A_FormatFloat Das aktuell gesetzte Floating-Point-Format von SetFormat.
A_SendMode [v1.1.23+]: Der aktuell gesetzte Modus (Event, Input, Play oder InputThenPlay) von SendMode.
A_SendLevel [v1.1.23+]: Die aktuelle Einstellung von SendLevel (ein Integer im Bereich von 0 bis 100).
A_StoreCapsLockMode [v1.1.23+]: Der aktuell gesetzte Modus (On oder Off) von SetStoreCapsLockMode.
A_KeyDelay
A_KeyDuration
Die aktuell gesetzte Verzögerung oder Dauer von SetKeyDelay (im dezimalen Format). A_KeyDuration benötigt [v1.1.23+].
A_KeyDelayPlay
A_KeyDurationPlay
Die aktuell gesetzte Verzögerung oder Dauer von SetKeyDelay für den SendPlay-Modus (im dezimalen Format). Benötigt [v1.1.23+].
A_WinDelay Die aktuell gesetzte Verzögerung von SetWinDelay (im dezimalen Format).
A_ControlDelay Die aktuell gesetzte Verzögerung von SetControlDelay (im dezimalen Format).
A_MouseDelay
A_MouseDelayPlay
Die aktuell gesetzte Verzögerung von SetMouseDelay (im dezimalen Format). A_MouseDelay gilt für den traditionellen SendEvent-Modus, während A_MouseDelayPlay für den SendPlay-Modus vorgesehen ist. A_MouseDelayPlay benötigt [v1.1.23+].
A_DefaultMouseSpeed Die aktuell gesetzte Geschwindigkeit von SetDefaultMouseSpeed (im dezimalen Format).
A_CoordModeToolTip
A_CoordModePixel
A_CoordModeMouse
A_CoordModeCaret
A_CoordModeMenu
[v1.1.23+]: Der aktuell gesetzte Modus (Window, Client oder Screen) von CoordMode.
A_RegView [v1.1.08+]: Die aktuell gesetzte Registry-Ansicht von SetRegView.
A_IconHidden Enthält 1, wenn das Tray-Symbol gerade versteckt ist, ansonsten 0. Mit der #NoTrayIcon-Direktive oder dem Menu-Befehl kann das Symbol versteckt werden.
A_IconTip Leer, es sei denn, ein benutzerdefinierter ToolTip für das Tray-Symbol wurde Menu, Tray, Tip definiert -- dann ist der Text des ToolTips enthalten.
A_IconFile Leer, es sei denn, ein benutzerdefiniertes Tray-Symbol wurde via Menu, Tray, Icon definiert -- dann ist der vollständige Pfadname der Datei für das neue Symbol enthalten.
A_IconNumber Leer, wenn A_IconFile leer ist. Ansonsten ist die Nummer der Symbolgruppe enthalten, die in A_IconFile verwendet wird (üblicherweise 1).

Inaktivität des Benutzers

A_TimeIdle Die Zeit in Millisekunden, die seit der letzten Eingabe via Tastatur, Maus usw. verstrichen ist. Diese Variable ist nützlich, um herauszufinden, ob der Benutzer abwesend ist. Physische Benutzereingaben sowie künstlich erzeugte Eingaben von beliebigen Programmen oder Skripten (z. B. der Send- oder MouseMove-Befehl) werden diesen Wert wieder auf 0 setzen. Da dieser Wert meistens schrittweise um 10 erhöht wird, ist es ratsam, ihn nicht zu überprüfen, ob er exakt mit einem anderen Wert übereinstimmt. Überprüfen Sie stattdessen, ob dieser Wert größer oder kleiner als ein anderer Wert ist. Zum Beispiel: IfGreater, A_TimeIdle, 600000, MsgBox, Die letzte Eingabeaktivität erfolgte vor ca. 10 Minuten.
A_TimeIdlePhysical Ähnlich wie oben, allerdings werden künstliche Tastatureingaben und/oder Mausklicks ignoriert, wenn der entsprechende Hook (Tastatur oder Maus) installiert ist; das heißt, dass diese Variable nur auf physische Ereignisse reagiert. Dadurch wird verhindert, dass simulierte Tastatureingaben und Mausklicks fälschlicherweise die Aktivität des Benutzers vortäuschen. Wenn keine Hooks installiert sind, ist diese Variable äquivalent zu A_TimeIdle. Wenn nur ein Hook installiert ist, wird A_TimeIdlePhysical nur von dieser Art von physischer Eingabe beeinflusst (die Eingabe des anderen/nicht-installierten Hooks, hat sowohl physisch als auch künstlich keine Auswirkung).
A_TimeIdleKeyboard
[v1.1.28+]
Wenn der Tastatur-Hook installiert ist, enthält diese Variable die Anzahl der Millisekunden, die seit der letzten physischen Tastatureingabe verstrichen sind. Ansonsten ist diese Variable äquivalent zu A_TimeIdle.
A_TimeIdleMouse
[v1.1.28+]
Wenn der Maus-Hook installiert ist, enthält diese Variable die Anzahl der Millisekunden, die seit der letzten physischen Mauseingabe verstrichen sind. Ansonsten ist diese Variable äquivalent zu A_TimeIdle.

GUI-Fenster und Menüleisten

A_DefaultGui [v1.1.23+] Name oder Nummer der im aktuellen Thread verwendeten Standard-GUI.
A_DefaultListView [v1.1.23+] Variablenname oder HWND des ListView-Steuerelements, auf dem sich die ListView-Funktionen gerade beziehen. Wenn die Standard-GUI keine ListView hat, ist diese Variable leer.
A_DefaultTreeView [v1.1.23+] Variablenname oder HWND des TreeView-Steuerelements, auf dem sich die TreeView-Funktionen gerade beziehen. Wenn die Standard-GUI keine TreeView hat, ist diese Variable leer.
A_Gui Name oder Nummer einer GUI, die den aktuellen Thread gestartet hat. Diese Variable ist leer, es sei denn, ein GUI-Steuerelement, Menüpunkt oder Ereignis wie GuiClose/GuiEscape hat den aktuellen Thread gestartet.
A_GuiControl Der zugeordnete Variablenname eines GUI-Steuerelements, das den aktuellen Thread gestartet hat. Wenn dieses Steuerelement keine zugeordnete Variable hat, enthält A_GuiControl stattdessen die ersten 63 Zeichen des Steuerelementtextes (auf diese Weise können zum Beispiel Button-Steuerelemente angesteuert werden, ohne ihnen zwingend einen Variablennamen zuzuweisen). A_GuiControl ist leer, wenn: 1) A_Gui leer ist; 2) ein GUI-Menüpunkt oder Ereignis wie GuiClose/GuiEscape den aktuellen Thread gestartet hat; 3) das Steuerelement keine zugeordnete Variable und Beschriftung hat; oder 4) das Steuerelement, das den aktuellen Thread ursprünglich gestartet hat, nicht mehr existiert (z. B. aufgrund von Gui Destroy).
A_GuiWidth
A_GuiHeight
Diese Variablen enthalten die Breite und Höhe des GUI-Fensters für GuiSize-Ereignisse. Diese gelten nur für den Clientbereich des GUI-Fensters (das ist der Bereich ohne Titelleiste, Menüleiste und Rahmen). [v1.1.11+]: Diese Werte werden von der DPI-Skalierung beeinflusst.
A_GuiX
A_GuiY
Diese Variablen enthalten X/Y-Koordinaten für GuiContextMenu- und GuiDropFiles-Ereignisse. Die Koordinaten sind relativ zur linken oberen Ecke des Fensters. [v1.1.11+]: Diese Werte werden von der DPI-Skalierung beeinflusst.
A_GuiEvent
oder A_GuiControlEvent

Die Art des Ereignisses, das den aktuellen Thread gestartet hat. Wenn der Thread nicht durch eine GUI-Aktion gestartet wurde, ist diese Variable leer. Ansonsten enthält sie eine der folgenden Zeichenketten:

Normal: Das Ereignis wurde durch einen Linksklick oder durch Tastatureingaben ausgelöst (, , , , Tab, Leer, unterstrichene Tastenkürzel und so weiter). Dieser Wert wird auch für Menüpunkte und spezielle Ereignisse wie GuiClose und GuiEscape verwendet.

DoubleClick: Das Ereignis wurde durch einen Doppelklick ausgelöst. Hinweis: Der erste Klick des Doppelklicks bewirkt immer noch, dass ein Normal-Ereignis ausgelöst wird. Das heißt, dass die Subroutine zweimal gestartet wird: zuerst durch den ersten Klick und dann durch den zweiten Klick.

RightClick: Tritt nur bei GuiContextMenu, ListViews und TreeViews auf.

Kontextabhängige Werte: Um mehr zu erfahren, siehe GuiContextMenu, GuiDropFiles, Slider, MonthCal, ListView und TreeView.

A_EventInfo

Enthält zusätzliche Informationen über die folgenden Ereignisse:

Hinweis: Jeder Thread verwaltet seine eigenen Werte für A_Gui, A_GuiControl, A_GuiX/Y, A_GuiEvent und A_EventInfo (im Gegensatz zu Variablen wie A_ThisHotkey). Das heißt, dass die aktuellen Werte solcher Variablen für jeden Thread erhalten bleiben, egal ob er zwischenzeitlich von einem anderen Thread unterbrochen wird.

Hotkeys, Hotstrings und benutzerdefinierte Menüpunkte

A_ThisMenuItem Der Name des zuletzt ausgewählten benutzerdefinierten Menüpunkts (ansonsten leer).
A_ThisMenu Der Name des Menüs, wo A_ThisMenuItem ausgewählt wurde.
A_ThisMenuItemPos Eine Nummer, die die aktuelle Position von A_ThisMenuItem innerhalb von A_ThisMenu repräsentiert. Der erste Menüpunkt ist 1, der Zweite ist 2 und so weiter. Menütrennlinien werden mitgezählt. Diese Variable ist leer, wenn A_ThisMenuItem leer ist oder innerhalb von A_ThisMenu nicht mehr existiert. Sie ist auch leer, wenn A_ThisMenu selbst nicht mehr existiert.
A_ThisHotkey

Der zuletzt ausgeführte Hotkey oder nicht-automatisch-ersetzende Hotstring (ansonsten leer), z. B. #z. Dieser Wert ändert sich, wenn der aktuelle Thread von einem anderen Hotkey unterbrochen wird, deshalb ist es ratsam, diesen Wert sofort in eine andere Variable zu speichern, wenn der originale Wert später für eine andere Subroutine benötigt wird.

Jeder neu erstellte Hotkey -- entweder via Hotkey-Befehl oder Zweifach-Doppelpunkt-Label -- erhält einen fest zugewiesenen Namen, der eine Zeichenkette bestehend aus seinem Tastennamen und der Reihenfolge seiner Modifikatorsymbolen ist. Dieser Name wird von allen Varianten des Hotkeys verwendet.

Siehe auch: A_ThisLabel

A_PriorHotkey Das gleiche wie oben, aber für den vorher ausgeführten Hotkey. Ansonsten leer.
A_PriorKey [v1.1.01+]: Der Name der Taste, die vor dem Drücken oder Loslassen der letzten Taste gedrückt wurde, oder leer, wenn kein geeigneter Tastendruck im Tastenverlauf gefunden werden kann. Alle via Skript erzeugten Eingaben werden ignoriert. Bevor diese Variable genutzt werden kann, muss der Tastatur- oder Maus-Hook installiert und der Tastenverlauf aktiviert sein.
A_TimeSinceThisHotkey Die Zeit in Millisekunden, die seit dem Drücken von A_ThisHotkey verstrichen ist. Dieser Wert wird -1 sein, wenn A_ThisHotkey leer ist.
A_TimeSincePriorHotkey Die Zeit in Millisekunden, die seit dem Drücken von A_PriorHotkey verstrichen ist. Dieser Wert wird -1 sein, wenn A_PriorHotkey leer ist.
A_EndChar Ein Endungszeichen, das der Benutzer zuletzt gedrückt hat, um einen nicht-automatisch-ersetzenden Hotstring auszulösen. Wenn kein Endungszeichen notwendig war (wegen der *-Option), wird diese Variable leer sein.

Betriebssystem und Benutzerinformationen

ComSpec [v1.0.43.08+]
A_ComSpec [v1.1.28+]

Enthält wie die ComSpec-Umgebungsvariable den Pfadnamen des Befehlszeileninterpreters. Diese Variable wird oft in Verbindung mit Run/RunWait genutzt. Zum Beispiel:

C:\Windows\system32\cmd.exe
A_Temp
[v1.0.43.09+]

Der vollständige Pfadname des Ordners zum Speichern von temporären Dateien. Folgende Standorte werden der Reihenfolge nach durchsucht, um den Pfadnamen zu ermitteln: 1) Umgebungsvariable TMP, TEMP oder USERPROFILE; 2) Windows-Verzeichnis. Zum Beispiel:

C:\Users\<Benutzer>\AppData\Local\Temp
A_OSType Der aktuelle Typ des Betriebssystems. Da AutoHotkey 1.1 nur NT-basierte Betriebssysteme unterstützt, wird diese Variable immer WIN32_NT enthalten. Ältere Versionen von AutoHotkey geben WIN32_WINDOWS zurück, wenn Windows 95/98/ME als Betriebssystem verwendet wird.
A_OSVersion

Enthält je nach Windows-Version eine der folgenden Zeichenketten: WIN_7 [benötigt AHK_L 42+], WIN_8 [benötigt v1.1.08+], WIN_8.1 [benötigt v1.1.15+], WIN_VISTA, WIN_2003, WIN_XP, WIN_2000.

Beachten Sie, dass das Betriebssystem eine andere Versionsnummer meldet bzw. A_OSVersion einen anderen Wert enthält, wenn der Kompatibilitätsmodus im Eigenschaftsfenster der AutoHotkey-Datei oder des kompilierten Skripts eingeschaltet ist.

[v1.1.20+]: Wenn die Version des Betriebssystems nicht als eine der oben aufgelisteten Versionen erkannt wird, enthält die Variable eine Zeichenkette im Format "Haupt.Neben.Build". 10.0.14393 wäre beispielsweise Windows 10 Build 14393, auch bekannt als Version 1607.

; Das folgende Beispiel ist obsolet, da diese Betriebssysteme nicht mehr unterstützt werden.
if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME  ; Hinweis: Keine Leerzeichen hinter oder nach den Kommas.
{
    MsgBox Dieses Skript benötigt Windows 2000/XP oder höher.
    ExitApp
}
A_Is64bitOS [v1.1.08+]: Enthält 1 (wahr), wenn das Betriebssystem eine 64-Bit-Version ist, oder 0 (falsch), wenn es eine 32-Bit-Version ist.
A_PtrSize [AHK_L 42+]: Enthält die Größe eines Pointers in Bytes. Dieser Wert ist entweder 4 oder 8, abhängig davon, ob zum Ausführen des Skripts die 32-Bit- oder 64-Bit-Version von AutoHotkey verwendet wird.
A_Language Die Standardsprache des Systems als 4-stelliger Code.
A_ComputerName Der Netzwerkname des Computers.
A_UserName Der Anmeldename des Benutzers, der dieses Skript gestartet hat.
A_WinDir Das Windows-Verzeichnis. Zum Beispiel: C:\Windows
A_ProgramFiles
oder ProgramFiles

Das Verzeichnis der Programmdateien (z. B. C:\Programme oder C:\Programme (x86)). Die Umgebungsvariable ProgramFiles enthält in der Regel denselben Wert.

Für 64-Bit-Systeme (nicht 32-Bit-Systeme) gilt Folgendes:

  • Wenn zum Ausführen des Skripts die 32-Bit-Version von AutoHotkey verwendet wird, enthält A_ProgramFiles den Pfadnamen des Ordners "Programme (x86)".
  • 32-Bit-Prozesse können auf die Umgebungsvariable ProgramW6432 zurückgreifen, um den Pfadnamen des 64-Bit-Ordners "Programme" abzurufen. In Windows 7 und höher steht diese Variable auch für 64-Bit-Prozesse zur Verfügung.
  • Die Umgebungsvariable ProgramFiles(x86) enthält den Pfadnamen des 32-Bit-Ordners "Programme (x86)".

[v1.0.43.08+]: Das Präfix "A_" kann weggelassen werden, um den Umstieg auf #NoEnv zu erleichtern.

A_AppData
[v1.0.43.09+]

Der vollständige Pfadname des Ordners, der anwendungsspezifische Daten des aktuellen Benutzers enthält. Zum Beispiel:

C:\Users\<Benutzer>\AppData\Roaming
A_AppDataCommon
[v1.0.43.09+]

Der vollständige Pfadname des Ordners, der anwendungsspezifische Daten aller Benutzer enthält. Zum Beispiel:

C:\ProgramData
A_Desktop

Der vollständige Pfadname des Ordners, der die Desktop-Dateien des aktuellen Benutzers enthält. Zum Beispiel:

C:\Users\<Benutzer>\Desktop
A_DesktopCommon

Der vollständige Pfadname des Ordners, der die Desktop-Dateien aller Benutzer enthält. Zum Beispiel:

C:\Users\Public\Desktop
A_StartMenu

Der vollständige Pfadname des Ordners, der die Startmenü-Dateien des aktuellen Benutzers enthält. Zum Beispiel:

C:\Users\<Benutzer>\AppData\Roaming\Microsoft\Windows\Start Menu
A_StartMenuCommon

Der vollständige Pfadname des Ordners, der die Startmenü-Dateien aller Benutzer enthält. Zum Beispiel:

C:\ProgramData\Microsoft\Windows\Start Menu
A_Programs

Der vollständige Pfadname des Programme-Ordners im Startmenü des aktuellen Benutzers. Zum Beispiel:

C:\Users\<Benutzer>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
A_ProgramsCommon

Der vollständige Pfadname des Programme-Ordners im Startmenü aller Benutzer. Zum Beispiel:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs
A_Startup

Der vollständige Pfadname des Autostart-Ordners im Startmenü des aktuellen Benutzers. Zum Beispiel:

C:\Users\<Benutzer>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
A_StartupCommon

Der vollständige Pfadname des Autostart-Ordners im Startmenü aller Benutzer. Zum Beispiel:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
A_MyDocuments

Der vollständige Pfadname des Ordners "Eigene Dokumente", der beliebige Dateien (vorzugsweise Dokumente) des aktuellen Benutzers enthält. Wenn der Ordner die oberste Ebene eines Laufwerks ist, wird im Gegensatz zu anderen ähnlichen Variablen der umgekehrte Schrägstrich am Ende weggelassen (zum Beispiel wäre M: anstelle von M:\ enthalten). Zum Beispiel:

C:\Users\<Benutzer>\Documents
A_IsAdmin

Wenn der aktuelle Benutzer über administrative Rechte verfügt, ist eine 1 enthalten. Ansonsten ist eine 0 enthalten.

Um das Skript sich selbst mit administrativen Rechten neu starten zu lassen (oder um diese Rechte vom Benutzer einzufordern), benutzt man Run *RunAs. Beachten Sie aber, dass die Ausführung des Skripts als Administrator dazu führt, dass alle vom Skript gestarteten Programme auch als Administrator ausgeführt werden. Eine mögliche Alternative finden Sie in der FAQ.

A_ScreenWidth
A_ScreenHeight

Die Breite und Höhe des primären Bildschirms in Pixel (z. B. 1024 und 768).

Mit SysGet können die Abmessungen von nicht-primären Bildschirmen abgerufen werden.

Das folgende Beispiel zeigt, wie die Breite und Höhe des gesamten Desktops ermittelt werden kann (selbst wenn er sich über mehrere Bildschirme erstrecken sollte):

SysGet, VirtuelleBreite, 78
SysGet, VirtuelleHöhe, 79

Mit SysGet kann zudem der Arbeitsbereich eines Bildschirms ermittelt werden. Dieser Bereich ist in der Regel kleiner als der Gesamtbereich des Bildschirms, weil die Taskleiste und andere registrierte Desktopsymbolleisten nicht berücksichtigt werden.

A_ScreenDPI [v1.1.11+] Die Anzahl der Pixel pro logischen Zoll entlang der Bildschirmbreite. Dieser Wert bezieht sich auf alle Bildschirme eines Systems. Standardmäßig gilt ein DPI-Wert von 96, abhängig von der Textgrößeneinstellung des Systems. Siehe auch Gui -DPIScale.
A_IPAddress1 bis 4 Die IP-Adressen der ersten 4 Netzwerkadapter im Computer.

Sonstiges

A_Cursor

Der Typ des aktuell angezeigten Mauszeigers. Die Variable kann eines der folgenden Wörter enthalten: AppStarting, Arrow, Cross, Help, IBeam, Icon, No, Size, SizeAll, SizeNESW, SizeNS, SizeNWSE, SizeWE, UpArrow, Wait, Unknown. Die Großbuchstaben nach Size sind Himmelsrichtungen, z. B. NESW = NorthEast+SouthWest (Nordosten+Südwesten). Die handförmigen Mauszeiger (Zeigen und Greifen) sind als Unknown klassifiziert.

A_CaretX
A_CaretY

Die aktuellen X- und Y-Koordinaten des Textcursors (Texteinfügemarke). Standardmäßig sind die Koordinaten relativ zum aktiven Fenster. Mit CoordMode können die Koordinaten relativ zum gesamten Bildschirm gemacht werden. Wenn kein Fenster aktiv ist oder die Position des Textcursors nicht ermittelt werden kann, sind diese Variablen leer.

Das folgende Skript zeigt die aktuellen Positionsdaten eines Textcursors mithilfe eines selbst-aktualisierenden ToolTips an. Beachten Sie, dass einige Fenster (z. B. bestimmte Versionen von MS Word) immer die gleichen Positionsdaten melden, wenn Sie den Textcursor verschieben.

#Persistent
SetTimer, TextcursorAbfragen, 100
return
TextcursorAbfragen:
    ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return
Clipboard Liest/Schreibt den Inhalt der system-internen Zwischenablage. Siehe Clipboard für mehr Details.
ClipboardAll Der gesamte Inhalt der Zwischenablage (z. B. Formatierung und Text). Siehe ClipboardAll.
ErrorLevel Liest/Schreibt ErrorLevel.
A_LastError Das Ergebnis der GetLastError()-Systemfunktion oder des letzten COM-Objektaufrufs. Weitere Informationen finden Sie unter DllCall() und Run/RunWait.
True
False

Enthalten 1 und 0. Sie können verwendet werden, um ein Skript besser lesbar zu machen. Siehe Boolesche Werte, um mehr zu erfahren.

Loop

A_Index Enthält die Nummer des aktuellen Schleifendurchlaufs (ein 64-Bit-Integer). Wenn beispielsweise das Skript den Schleifenkörper zum ersten Mal ausführt, enthält diese Variable eine 1. Weitere Informationen finden Sie unter Loop oder While-Schleife.
A_LoopFileName, etc. Diese und andere verwandten Variablen sind nur für Dateimuster-Schleifen relevant.
A_LoopRegName, etc. Diese und andere verwandten Variablen sind nur für Registry-Schleifen relevant.
A_LoopReadLine Siehe Datei-lesende Schleife.
A_LoopField Siehe Parsende Schleife.

Kapazität und Speicher einer Variable