Variablen und Ausdrücke

Inhaltsverzeichnis

Variablen

Variablentypen: In AutoHotkey müssen die Typen der Variablen nicht explizit definiert werden. Eine Variable aber, die nur Ziffern enthält (optional mit Dezimalpunkt), wird automatisch als Zahl interpretiert, wenn es in einer mathematischen Operation oder einem Vergleich erforderlich ist. Um die Performance zu verbessern, werden Zahlen intern zwischengespeichert, um Konvertierungen in/von Zeichenketten zu vermeiden.

Gültigkeitsbereiche und Deklarationen von Variablen: Alle Variablen, außer lokale Variablen in Funktionen, sind global; das heißt, dass ihre Inhalte im jeden Bereich des Skripts gelesen oder geändert werden können. Im Normalfall müssen Variablen nicht deklariert werden (in Funktionen gibt es Ausnahmen); Variablen stehen zur Verfügung, sobald sie verwendet werden (und enthalten zu Beginn eine leere Zeichenkette).

Variablennamen: Bei Variablennamen ist die Groß- und Kleinschreibung egal (zum Beispiel wäre AktuellesDatum das gleiche wie aktuellesdatum). Variablennamen können bis zu 253 Zeichen lang sein und dürfen nur aus Buchstaben, Zahlen und folgenden Satzzeichen bestehen: # _ @ $

Aufgrund von Gestaltungsrichtlinien ist es in der Regel am besten, die Variablen nur mit Buchstaben, Zahlen und Unterstriche zu benennen (zum Beispiel: PositionZeiger, Gesamt_Elemente und Eintrag_ist_gültig). Dadurch können Leute, die mit anderen Computersprachen vertraut sind, Ihr Skript besser verstehen. Wenn Sie die Richtlinien, die Sie in anderen Sprachen benutzen, auch in AutoHotkey anwenden, werden Sie es leichter haben, Ihre eigenen Skripte zu verstehen, falls Sie sie erneut lesen müssen.

Obwohl ein Variablenname vollständig aus Ziffern bestehen kann, sind solche Namen in der Regel nur für eingehende Befehlszeilenparameter relevant. Ausdrücke können keine numerischen Namen enthalten, weil sie dort nicht als Variablen, sondern als Zahlen interpretiert werden.

AND, OR und NOT werden in Ausdrücken als Operatoren interpretiert und sind deshalb als Variablennamen ungeeignet. Diese Art von Namen würden verhindern, dass der Ausdruck korrekt ausgewertet wird.

Speichern von Variablenwerten: Um eine Zeichenkette oder Zahl in eine Variable zu speichern, gibt es zwei Methoden: Traditionell oder via Ausdruck. Die traditionelle Methode verwendet den Gleichheitszeichenoperator (=), mit dem direkt geschriebene Zeichenketten ohne Anführungszeichen und in Prozentzeichen gesetzte Variablen zugewiesen werden können. 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 verwendet hingegen den Doppelpunkt-Gleich-Operator (:=), mit dem Zahlen, in Anführungszeichen gesetzte Zeichenketten und andere Arten von Ausdrücken zugewiesen werden können. Die folgenden Beispiele sind funktional identisch zu 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 verständlicher ist und weil sie eine Ausdruckssyntax unterstützt, die mit der Syntax in vielen anderen Sprachen identisch ist.

Wie Sie vielleicht schon erraten haben, gibt es zwei Methoden, um den Inhalt einer Variable zu löschen (um sie sozusagen leer zu machen):

MeineVar =
MeineVar := ""

Das leere Anführungszeichen-Paar sollte nicht mit dem Operator "=" zugewiesen werden, weil die Variable sonst zwei Anführungszeichen enthalten würde.

Abrufen von Variablenwerten: Wenn es zwei Methoden zum Speichern von Werten gibt, gibt es auch zwei Methoden, um sie abzurufen: Traditionell oder via Ausdruck. Die traditionelle Methode erfordert, dass jeder Name einer Variable mit Prozentzeichen umschlossen werden muss, um ihren Inhalt abzurufen. Zum Beispiel:

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

Die Ausdrucksmethode erfordert hingegen, dass die Prozentzeichen weggelassen und Zeichenketten in Anführungszeichen gesetzt werden müssen. Die folgenden Beispiele sind funktional identisch zu 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

Das Prozent- und Leerzeichen im oberen Beispiel dient dazu, die Ausdruckssyntax für den Parameter des MsgBox-Befehls zu erzwingen. Standardmäßig verwenden alle Befehle die traditionelle Syntax (wenn nicht anders beschrieben). In den Dokumentationen einiger Befehle werden Parameter beschrieben, die von sich aus Ausdrücke akzeptieren - in diesem Fall ist das vorangestellte Prozentzeichen erlaubt, aber nicht zwingend erforderlich. Die folgenden drei Beispiele sind funktional identisch, da der erste Parameter des Sleep-Befehls standardmäßig ein Ausdruck ist:

Sleep MillisekundenWarten
Sleep %MillisekundenWarten%
Sleep % MillisekundenWarten

Vergleichen von Variablen: Bitte lesen Sie den folgenden Abschnitt, um zu erfahren, welche verschiedenen Arten von Vergleichen es gibt, und wann und wo die runden Klammern notwendig sind.

Ausdrücke

Ausdrücke sind nützlich, um eine oder mehrere Operationen in Verbindung mit mehreren Variablen, direkt geschriebenen Zeichenketten und/oder direkt geschriebenen Zahlen durchzuführen.

Die Namen der Variablen dürfen innerhalb eines Ausdrucks nicht mit Prozentzeichen umschlossen werden (nur wenn es Pseudo-Arrays und anderweitige Doppelverweise sind). Direkt geschriebene Zeichenketten müssen demzufolge in Anführungszeichen gesetzt werden, um sie von Variablen zu unterscheiden. Zum Beispiel:

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

Im obigen Beispiel wurde "Blau" in Anführungszeichen gesetzt, weil es eine direkt geschriebene Zeichenkette ist. Das folgende Beispiel zeigt, wie mithilfe von zwei aufeinanderfolgenden Anführungszeichen ein tatsächliches Anführungszeichen in eine direkt geschriebene Zeichenkette eingefügt werden kann: "Sie sagte: ""Ein Apfel täglich.""".

Wichtig: Eine if-Anweisung, die einen Ausdruck enthält, unterscheidet sich von einer traditionellen if-Anweisung wie If GefundeneFarbe <> Blau dadurch, dass das Zeichen nach dem Wort "if" eine runde Startklammer ist. Eine if-Anweisung wird als Ausdruck angesehen, wenn sie entweder vollständig von runden Klammern umschlossen ist oder wenn man so etwas wie if (x > 0) and (y > 0) schreibt. Die runde Startklammer kann weggelassen werden, 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 ein leeres Anführungszeichen-Paar. Zum Beispiel wäre die Anweisung if (MeineVar <> "") wahr, wenn MeineVar nicht leer ist. In einer traditionellen if-Anweisung wird ein leeres Anführungszeichen-Paar jedoch als direkt geschriebener Text behandelt. Zum Beispiel wäre die Anweisung if MeineVar = "" nur wahr, wenn MeineVar genau diese zwei Zeichen enthält. Um also zu prüfen, ob eine Variable in einer traditionellen if-Anweisung leer ist, genügt es, nur ein = oder <> anzugeben; zum Beispiel: if Var =.

Ungültige Ausdrücke wie (x +* 3) geben immer eine leere Zeichenkette zurück.

Speichern eines Ausdruckswertes: Mit dem Operator ":=" kann der Wert bzw. das Ergebnis eines Ausdrucks in eine Variable gespeichert werden. Zum Beispiel:

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

Logische Werte: Das Ergebnis eines Ausdrucks (z. B. einer IF-Anweisung) ist falsch (False), wenn es leer oder eine 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 einen falschen Wert enthalten, 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 Zahl) und Floating-Point (Gleitkommazahl): Zahlen, die einen Dezimalpunkt enthalten, werden innerhalb eines Ausdrucks als Gleitkommazahlen gewertet; alle anderen Zahlen werden als Integer behandelt. Bei den meisten Operatoren -- wie Addition und Multiplikation -- gilt: Wenn einer der Eingabewerte eine Gleitkommazahl ist, wird das Ergebnis auch eine Gleitkommazahl sein.

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

Erzwingen eines Ausdrucks: 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

Operatoren gleicher Priorität wie Multiplizieren (*) und Dividieren (/) werden von links nach rechts ausgewertet, sofern nicht anders unten angegeben. Ein Operator mit niedrigerer Priorität wie Addieren (+) wird erst ausgewertet, wenn ein höherer Operator wie Multiplizieren (*) ausgewertet wurde. Zum Beispiel würde 3 + 2 * 2 wie 3 + (2 * 2) ausgewertet werden. Mit runden Klammern können die Prioritäten überschrieben werden. Zum Beispiel: (3 + 2) * 2

In einer mathematischen Operation werden leere Werte (leere Zeichenketten) oder nicht-numerische Werte nicht als 0 gewertet, wenn nicht anders unten angegeben. Stattdessen wird es als Fehler behandelt, wodurch 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 einer Variable gespeichert sind oder von einer Funktion zurückgegeben werden). Dieser nicht-numerische Attribut kann mit Verkettungen erzwungen werden, so dass Ausdrücke wie "0x" n einen nicht-numerischen Wert erzeugen würden (selbst wenn n gültige hexadezimale Ziffern enthalten würde). 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 auch immer 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 Pseudo-Array-Elemente zu verweisen, wie z. B:

Var := MeinArray%A_Index% + 100

Aus Gründen der Abwärtskompatibilität behandeln Befehlsparameter, die als "kann ein Ausdruck sein" dokumentiert sind, einen alleinstehenden Namen in Prozentzeichen (z. B. %Var%, aber nicht Array%i%), als wären die Prozentzeichen nicht vorhanden. Um das zu umgehen, kann der Verweis mit runden Klammern umschlossen werden; z. B. Sleep (%Var%).

[AHK_L 52+]: %Var% kann nicht nur in eine normale Variable, sondern auch in eine Umgebungsvariable, die Clipboard-Variable oder eine beliebige reservierte/schreibgeschützte 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 muss y ein direkt geschriebener Wert sein. Siehe Objekt-Syntax.
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) (wo y eine Variable ist, nicht ein Funktionsname). 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 wäre.
** Potenz. Sowohl die Basis als auch der Exponent können einen Dezimalpunkt enthalten. Ist der Exponent negativ, wird das Ergebnis in eine Gleitkommazahl umgewandelt, auch dann, wenn die Basis und der Exponent Integer sind. Da dieser Operator eine höhere Priorität hat als ein einstelliges 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.
-
!
~
& *

Einstelliges Minuszeichen (-): Obwohl dieser Operator dasselbe Symbol wie der Subtraktionsoperator verwendet, können einstellige Minuszeichen nur bei einzelnen Elementen oder Teilausdrücken angewendet werden: -(3 / -x). Der gegenteilige Operator, ein einstelliges Pluszeichen (+), wird in einem Ausdruck ignoriert.

Logisches NICHT (!): Wenn der Operand leer oder 0 ist, wird das Ergebnis nach Anwenden des logischen NICHTs eine 1 sein, also "wahr". Ansonsten ist das Ergebnis eine 0 (falsch). Zum Beispiel: !x or !(y and z). Hinweis: Das Wort NOT ist das Synonym zu !, allerdings hat ! eine höhere Priorität. In v1.0.46+ sind aufeinanderfolgende einstellige Operatoren wie !!Var 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 Gleitkommazahl, 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 vorzeichenbehafteter 64-Bit-Wert behandelt. Zum Beispiel wäre ~0xf0f dann 0xfffff0f0 (4294963440).

Adresse (&): &MeineVar ruft die Adresse des Inhalts von MeineVar im Speicher ab. Dieser Operator wird häufig in Verbindung mit DllCall-Strukturen genutzt. &MeineVar deaktiviert außerdem das Caching von Binärzahlen in dieser Variable, was ihre Performance bei Berechnungen oder numerischen Vergleichen verringern kann. Sobald sich die Adresse einer Variable ändert, wird das Caching wieder aktiviert (z. B. via VarSetCapacity()).

Dereferenzierung (*): *Ausdruck geht davon aus, dass Ausdruck in eine numerische Speicheradresse aufgelöst werden kann; dieser Operator ermittelt das Byte auf dieser Adresse, was eine Zahl zwischen 0 und 255 ist (es wird immer 0 abgerufen, wenn die Adresse 0 ist; jede andere ungültige Adresse sollte man lassen, weil das Skript ansonsten abstürzen könnte). Allerdings ist NumGet() deutlich besser darin, Binärzahlen abzurufen.

*
/
//

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

Echtes Dividieren (/): Im Gegensatz zu EnvDiv wird die echte Division immer eine Gleitkommazahl liefern, sogar 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 greift auf die hoch-performante Integer-Division zurück, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 5//3 gleich 1 und 5//-3 gleich -1. Wenn einer der beiden Eingabewerte eine Gleitkommazahl ist, wird die Gleitkomma-Division erfolgen und das Ergebnis auf den nächstmöglichen 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 Gleitkomma-Division ein Integer ist, wird es in nachfolgenden Operationen als Gleitkommazahl behandelt. Um mehr über Modulo zu erfahren, siehe Mod().

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

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

+
-

Addieren (+) und Subtrahieren (-). Die Operatoren += und -= sind eine Kurzschreibweise zum Erhöhen oder Verringern eines Variablenwertes. Var += 2 liefert zum Beispiel das gleiche Ergebnis wie Var := Var + 2 (obwohl die erste Methode performanter ist). Desweiteren kann eine Variable mit Var++, Var--, ++Var oder --Var schrittweise um 1 erhöht oder verringert werden.

<<
>>
Bitweise Verschiebung nach links (<<) und nach rechts (>>). Anwendungsbeispiel: Wert1 << Wert2. Jeder Eingabewert im Gleitkommaformat wird vor der Berechnung zu einem 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 nächstmöglichen 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 Eingabewert im Gleitkommaformat wird vor der Berechnung zu einem Integer gekürzt.
.

Verkettung. Mit dem Punkt-Operator können zwei Elemente zu einer Zeichenkette kombiniert werden (auf beiden Seiten des Punktes muss mindestens ein Leerzeichen vorhanden sein). Sie können diesen Punkt auch weglassen, um dasselbe Ergebnis zu erzielen (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" würde beispielsweise ErrorLevel auf 0 setzen und eine 4 liefern (die Position des ersten numerischen Zeichens). Früher vor v1.1.03 hatte dieser Operator die gleiche Priorität wie der Gleichheitsoperator (=) und war unvollständig dokumentiert.
>   <
>= <=
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 unterscheidet nur zwischen Groß- und Kleinschreibung, wenn StringCaseSense aktiviert 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. Wenn dies nicht der Fall ist, wird == immer Groß-/Kleinschreibung-sensitiv sein und = immer nicht-Groß-/Kleinschreibung-sensitiv sein (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.
NOT Logisches NICHT. Abgesehen von seiner geringeren Priorität ist dieser Operator funktional identisch zum !-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 würde beispielsweise eine 2 in Var speichern, falls x größer als y ist; ansonsten wird eine 3 gespeichert. 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 konnte dieser Operatoren nur der am weitesten links befindlichen Operator sein, außerdem wurden nur die ersten fünf Operatoren unterstützt). Der einfachste Zuweisungsoperator ist der Doppelpunkt-Gleich-Operator (:=), der verwendet wird, um das Ergebnis eines Ausdrucks in eine Variable zu speichern. Eine Beschreibung der anderen Operatoren finden Sie in den entsprechenden Einträgen dieser Tabelle. Var //= 2 führt beispielsweise eine Floor-Division durch, um Var durch 2 zu teilen, und speichert dann das Ergebnis wieder in Var. Ein weiteres Beispiel ist Var .= "abc", das 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 Verweis (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 er eine Floor-Division durch, es sei denn, einer der Eingabewerte ist eine Gleitkommazahl (in allen anderen Fällen wird /= eine echte Division durchführen); 2) Datum/Zeit-Berechnung wird von += und -= nur unterstützt, 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 als auch 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, func(). 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.

In v1.0.46.01+ wird ein Gleichheitszeichen, das direkt nach einem Komma und einer Variable erfolgt, 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 einfache 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 3 + 2 zuerst auswerten.

mod()
round()
abs()

Funktionsaufruf. Der Name einer Funktion muss unmittelbar danach mit einer runden Startklammer beginnen, ohne Leer- oder Tabulatorzeichen dazwischen. 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. Üblicherweise 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(Parameter*)

[AHK_L 60+]: Variadischer Funktionsaufruf. Parameter 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 muss y eine Parameterliste sein, oder ein Ausdruck, der einen Methodennamen zurückgibt.

[v1.0.97+]: Direkte Array-Schreibweise. Wenn vor der eckigen Startklammer kein Wert (oder Teilausdruck, der einen Wert zurückgibt) angegeben ist, wird sie stattdessen 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).

Siehe Array-Syntax und Objekt-Syntax, um mehr zu erfahren.

{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. Siehe Assoziative Arrays, um mehr zu erfahren.


Performance: In v1.0.48+ sind Ausdrücke, die mit einem Komma getrennt werden, 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. Solche Variablen, außer Clipboard, ErrorLevel und Befehlszeilenparameter, sind schreibgeschützt; das heißt, dass man ihren Inhalt nicht ändern kann.

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%). Die Variable %0% enthält die Anzahl der Parameter, die übergeben worden sind (0 wenn keine). Einzelheiten finden Sie unter Befehlszeilenparameter.
A_WorkingDir Das aktuelle Arbeitsverzeichnis, von wo aus das Skript standardmäßig auf Dateien zugreift. Der letzte umgekehrte Schrägstrich ist nicht enthalten, es sein denn, es ist das Stammverzeichnis. Zwei Beispiele: C:\ und C:\Meine Dokumente. Mit SetWorkingDir kann das Arbeitsverzeichnis geändert werden.
A_ScriptDir Der vollständige Pfad des Verzeichnisses, wo das aktuelle Skript zu finden ist. 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 von den zwei Variablen darüber, um den vollständigen Pfad des Skripts zu erhalten, 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 die Zeile aus einer #Include-Datei). 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 Pfad 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. Sie enthält die Version des AutoHotkey-Programms, mit dem das Skript ausgeführt wird, z. B. 1.0.22. In einem kompilierten Skript wird die Version des AutoHotkey-Programms gemeldet, mit der das Skript ursprünglich kompiliert worden ist. 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 Pfad 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 eine 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.
A_IsCompiled Enthält eine 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.
A_ExitReason Der aktuellste Grund, warum das Skript beendet werden soll. Diese Variable enthält nur einen Wert, wenn das Skript eine OnExit-Subroutine hat, die entweder 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 Zeit oder das Datum in einem Format darzustellen, das Ihrem Gebietsschema oder Ihrer Sprache entspricht, verwendet man FormatTime, AusgabeVar (Zeit und langes Datum) oder FormatTime, AusgabeVar,, LongDate (ermittelt ein Datum im langen Format).
A_MM Der aktuelle zweistellige Monat (01-12). A_Mon enthält denselben Wert.
A_DD Der aktuelle zweistellige 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 einstellige 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 + 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 zweistellige 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 zweistellige Minute (00-59).

A_Sec Die aktuelle zweistellige Sekunde (00-59).
A_MSec Die aktuelle dreistellige 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: Mit EnvAdd und EnvSub können beliebige Datum- und Zeitwerte berechnet werden. Mit FormatTime können außerdem beliebige Datum- und Zeitwerte in einem Format dargestellt werden, das Ihrem Gebietsschema oder Ihrer Sprache entspricht.
A_NowUTC Die Coordinated Universal Time (UTC) im YYYYMMDDHH24MISS-Format. UTC ist grundsätzlich das gleiche wie Greenwich Mean Time (GMT).
A_TickCount

Ruft die Zeit in Millisekunden ab, die seit dem Systemstart verstrichen ist. Wenn man A_TickCount in eine Variable speichert und später mit dem neuesten A_TickCount-Wert subtrahiert, erhält man einen Wert, der eine verstrichene Zeit repräsentiert. Zum Beispiel:

Startzeit := A_TickCount
Sleep, 1000
Laufzeit := A_TickCount - Startzeit
MsgBox,  %Laufzeit% 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 eine 1, wenn das Skript via Suspend gesperrt wurde, ansonsten 0.
A_IsPaused
[v1.0.48+]
Enthält eine 1, wenn der Thread, der sich direkt unter dem aktuellen Thread befindet, pausiert wurde. Ansonsten enthält sie eine 0.
A_IsCritical
[v1.0.48+]
Enthält eine 0, wenn Critical im aktuellen Thread ausgeschaltet ist. Ansonsten enthält sie einen Integer-Wert größer als 0, der die aktuell gesetzte Meldungsüberprüfungsfrequenz von Critical repräsentiert. Da Critical 0 den kritischen Status eines Threads ausschaltet, kann der aktuelle Status von Critical mithilfe von Alt_IsCritical := A_IsCritical gespeichert und später mit Critical %Alt_IsCritical% wiederhergestellt werden.
A_BatchLines (oder A_NumBatchLines) Der aktuell gesetzte Wert von SetBatchLines. Beispiele: 200 oder 10ms (je nach Format).
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 Codierung, die standardmäßig für alle Befehle gilt; siehe FileEncoding.
A_FormatInteger Das aktuell gesetzte Integer-Format (H oder D) von SetFormat. [AHK_L 42+]: Ein kleingeschriebenes h kann auch enthalten sein.
A_FormatFloat Das aktuell gesetzte Gleitkommazahlenformat 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 zwischen 0 und 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 (immer dezimal, niemals hexadezimal). 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 (immer dezimal, niemals hexadezimal). Benötigt [v1.1.23+].
A_WinDelay Die aktuell gesetzte Verzögerung von SetWinDelay (immer dezimal, nicht hexadezimal).
A_ControlDelay Die aktuell gesetzte Verzögerung von SetControlDelay (immer dezimal, nicht hexadezimal).
A_MouseDelay
A_MouseDelayPlay
Die aktuell gesetzte Verzögerung von SetMouseDelay (immer dezimal, nicht hexadezimal). A_MouseDelay ist für den traditionellen SendEvent-Modus, und A_MouseDelayPlay für SendPlay. A_MouseDelayPlay benötigt [v1.1.23+].
A_DefaultMouseSpeed Die aktuell gesetzte Geschwindigkeit von SetDefaultMouseSpeed (immer dezimal, nicht hexadezimal).
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 eine 1, wenn das Infobereichssymbol gerade versteckt ist, ansonsten 0. Mit der #NoTrayIcon-Direktive oder dem Menu-Befehl kann das Symbol versteckt werden.
A_IconTip Enthält den Text des ToolTips, den man via Menu, Tray, Tip für das Infobereichssymbol definiert hat. Ansonsten ist diese Variable leer.
A_IconFile Enthält den vollständigen Pfad der Symboldatei, die man via Menu, Tray, Icon für das Infobereichssymbol definiert hat. Ansonsten ist diese Variable leer. Bekannte Einschränkung: Dieser Pfad ist eventuell falsch, wenn das Skript ursprünglich einen relativen Pfad übergeben hat, der zu einer DLL-Systemdatei führt; zum Beispiel Menu, Tray, Icon, user32.dll, 2.
A_IconNumber Leer, wenn A_IconFile leer ist. Ansonsten enthält diese Variable die Nummer des A_IconFile-Symbols (üblicherweise 1).

Inaktive Zeit des Benutzers

A_TimeIdle Ruft die Zeit in Millisekunden ab, die seit der letzten Eingabe (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 tendenziell um 10 erhöht wird, ist es ratsam, ihn nicht zu überprüfen, ob er mit einem anderen Wert exakt ü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 kein einziger Hook installiert ist, enthält diese Variable denselben Wert wie 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).

GUI-Fenster und Menüleisten

A_DefaultGui [v1.1.23+] Name oder Nummer der Standard-GUI im aktuellen Thread.
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 der GUI, die den aktuellen Thread gestartet hat. Diese Variable enthält nur einen Wert, wenn ein GUI-Steuerelement, Menüleistenelement oder Ereignis wie GuiClose/GuiEscape den aktuellen Thread gestartet hat.
A_GuiControl Der zugeordnete Variablenname des GUI-Steuerelements, das den aktuellen Thread gestartet hat. Wenn dieses Steuerelement keine zugeordnete Variable hat, enthält A_GuiControl stattdessen die ersten 63 Zeichen seines Textes/seiner Beschriftung (besonders nützlich, um auf eine Schaltfläche zu verweisen). A_GuiControl ist leer, wenn: 1) A_Gui leer ist; 2) ein GUI-Menüleistenpunkt 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, sofern sie innerhalb einer GuiSize-Subroutine abgerufen werden. Sie beziehen sich auf den Clientbereich des GUI-Fensters, also 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 die X- und Y-Koordinaten, wenn sie in Verbindung mit GuiContextMenu- und GuiDropFiles-Ereignissen verwendet werden. 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 (Pfeiltasten, Tabulatortaste, Leertaste, unterstrichene Tastenkürzel und so weiter). Dieser Wert wird auch für Menüleistenelemente und Sonderereignisse wie GuiClose und GuiEscape verwendet.

DoubleClick: Das Ereignis wurde durch einen Doppelklick ausgelöst. Hinweis: Der erste Klick des Doppelklicks bewirkt, dass zuerst ein Normal-Ereignis ausgelöst wird. Mit anderen Worten wird die Subroutine zweimal gestartet: 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 beispielsweise, dass auch dann noch die ursprünglichen/richtigen Werte in diesen Variablen enthalten sind, wenn ein Thread zwischendurch von einem anderen Thread unterbrochen werden musste.

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, in dem 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 zählen mit. Wenn A_ThisMenuItem leer ist oder nicht mehr in A_ThisMenu existiert, wird diese Variable leer gemacht. 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 noch in einer Subroutine benötigt wird.

Wenn ein Hotkey zum ersten Mal erstellt wird -- entweder mit dem Hotkey-Befehl oder einem Doppelpunkt-Label -- wird seine aktuelle Taste und die aktuelle Reihenfolge seiner Modifikatorzeichen verwendet, um einen permanenten Namen für diesen Hotkey zu bestimmen, der für alle Varianten des Hotkeys gelten wird.

Siehe auch: A_ThisLabel

A_PriorHotkey Das gleiche wie oben, aber für den vorherigen Hotkey. Wenn es diesen Hotkey nicht gibt, wird die Variable leer gemacht.
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. Damit diese Variable genutzt werden kann, muss der Tastatur- oder Maus-Hook installiert und der Tastenverlauf aktiviert sein.
A_TimeSinceThisHotkey Ruft die Zeit in Millisekunden ab, die seit dem Drücken von A_ThisHotkey verstrichen ist. Dieser Wert wird -1 sein, wenn A_ThisHotkey leer ist.
A_TimeSincePriorHotkey Ruft die Zeit in Millisekunden ab, die seit dem Drücken von A_PriorHotkey verstrichen ist. Dieser Wert wird -1 sein, wenn A_PriorHotkey leer ist.
A_EndChar Das 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 gemacht.

Betriebssystem und Benutzerinformationen

ComSpec
[v1.0.43.08+]
Enthält, wie die ComSpec-Umgebungsvariable auch, den Pfadnamen des Befehlszeileninterpreters (z. B. C:\Windows\system32\cmd.exe). Diese Variable wird oft in Verbindung mit Run/RunWait genutzt. Hinweis: Bei dieser Variable fehlt das Präfix "A_".
A_Temp
[v1.0.43.09+]
Der vollständige Pfadname des Ordners, der zum Speichern von temporären Dateien auserkoren wurde (z. B. C:\DOCUME~1\<Benutzername>\LOCALS~1\Temp). Folgende Standorte werden der Reihenfolge nach durchsucht, um den Pfadnamen zu ermitteln: 1) Umgebungsvariable TMP, TEMP oder USERPROFILE; 2) Windows-Verzeichnis.
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. dass 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 Ihres 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 neben den Kommas.
{
    MsgBox Dieses Skript benötigt Windows 2000/XP oder höher.
    ExitApp
}
A_Is64bitOS [v1.1.08+]: Enthält eine 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 eine 4 oder eine 8, abhängig davon, ob die verwendete AutoHotkey-Datei eine 32-Bit- oder 64-Bit-Datei ist.
A_Language Die Standardsprache des Systems als vierstelliger 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

Der Programme-Ordner (z. B. C:\Programme oder C:\Programme (x86)). Die Umgebungsvariable ProgramFiles enthält in der Regel denselben Wert.

Bei 64-Bit-Systemen (nicht bei 32-Bit-Systemen) muss folgendes beachtet werden:

  • Wenn die EXE-Datei, mit der das Skript ausgeführt wird, eine 32-Bit-Datei ist, enthält A_ProgramFiles den Pfadnamen des Ordners "Program Files (x86)".
  • Bei 32-Bit-Prozessen kann die Umgebungsvariable ProgramW6432 abgerufen werden, um den Pfadnamen des 64-Bit-Ordners "Program Files" zu erhalten. Ab Windows 7 kann diese Umgebungsvariable auch bei 64-Bit-Prozessen abgerufen werden.
  • Die Umgebungsvariable ProgramFiles(x86) enthält den Pfadnamen des 32-Bit-Ordners "Program Files (x86)".

In v1.0.43.08+ kann das Präfix "A_" weggelassen werden, um den Übergang zu #NoEnv zu erleichtern.

A_AppData
[v1.0.43.09+]
Der vollständige Pfad des Ordners mit anwendungsspezifischen Daten des aktuellen Benutzers. Zum Beispiel: C:\Dokumente und Einstellungen\Benutzername\Anwendungsdaten
A_AppDataCommon
[v1.0.43.09+]
Der vollständige Pfad des Ordners mit anwendungsspezifischen Daten aller Benutzer.
A_Desktop Der vollständige Pfad des Ordners mit den Desktop-Dateien des aktuellen Benutzers.
A_DesktopCommon Der vollständige Pfad des Ordners mit den Desktop-Dateien aller Benutzer.
A_StartMenu Der vollständige Pfad des Ordners mit den Startmenü-Dateien des aktuellen Benutzers.
A_StartMenuCommon Der vollständige Pfad des Ordners mit den Startmenü-Dateien aller Benutzer.
A_Programs Der vollständige Pfad des Programmordners im Startmenü des aktuellen Benutzers.
A_ProgramsCommon Der vollständige Pfad des Programmordners im Startmenü aller Benutzer.
A_Startup Der vollständige Pfad des Autostart-Ordners im Startmenü des aktuellen Benutzers.
A_StartupCommon Der vollständige Pfad des Autostart-Ordners im Startmenü aller Benutzer.
A_MyDocuments Der vollständige Pfad des Ordners "Eigene Dokumente" des aktuellen Benutzers. Wenn der Ordner das Stammverzeichnis eines Laufwerks ist, ist das letzte Zeichen in dieser Variable im Gegensatz zu anderen ähnlichen Variablen kein umgekehrter Schrägstrich. Zum Beispiel würde sie M: statt M:\ enthalten.
A_IsAdmin

Wenn der aktuelle Benutzer Administratorrechte hat, enthält diese Variable eine 1. Ansonsten enthält sie eine 0.

Damit das Skript sich selbst neu starten kann, um Administratorrechte zu erhalten (oder um dem Benutzer mitzuteilen, dass das Skript Administratorrechte benötigt), benutzt man Run *RunAs. Beachten Sie aber, dass ein mit Adminrechten gestartetes Skript dazu führt, dass alle Programme, die das Skript startet, auch Adminrechte haben werden. Eine mögliche Alternative finden Sie in der FAQ.

A_ScreenWidth
A_ScreenHeight

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

Mit SysGet können die Abmessungen von anderen Anzeigegeräten abgerufen werden.

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

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

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

A_ScreenDPI [v1.1.11+] Die Anzahl der Pixel pro logischem Zoll entlang der Bildschirmbreite. Bei einem System mit mehreren Anzeigegeräten ist dieser Wert bei jedem Anzeigegerät gleich. Bei den meisten Systemen ist dieser Wert eine 96; abhängig von der Textgrößeneinstellung (DPI) des Systems. Siehe auch Gui -DPIScale.
A_IPAddress1 bis 4 Die IP-Adressen der ersten 4 Netzwerkadaptern 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, werden diese Variablen leer gemacht.

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 Enthält den Inhalt der system-internen Zwischenablage. Mit dieser Variable kann die Zwischenablage sowohl gelesen als auch geändert werden. Siehe Clipboard für mehr Details.
ClipboardAll Der gesamte Inhalt der Zwischenablage (z. B. Formatierung und Text). Siehe ClipboardAll.
ErrorLevel Siehe ErrorLevel.
A_LastError Das Ergebnis der GetLastError()-Systemfunktion oder des letzten COM-Objektaufrufs. Weitere Informationen finden Sie unter DllCall() und Run/RunWait.

Loop

A_Index Enthält die Nummer des aktuellen Schleifendurchlaufs (ein 64-Bit-Integer). Wenn das Skript beispielsweise 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.

Umgebungsvariablen vs. normale Variablen

Umgebungsvariablen werden vom Betriebssystem verwaltet. Sie können sich eine Liste von Umgebungsvariablen anzeigen lassen, wenn Sie in der Windows-Konsole SET eingeben und ENTER drücken.

Mit EnvSet kann eine neue Umgebungsvariable erstellt oder der Inhalt einer vorhandenen Umgebungsvariable geändert werden. Allerdings sind solche Ergänzungen und Änderungen privater Natur; das heißt, dass sie nur für das Skript sichtbar sind und im restlichen System ignoriert werden. Wenn ein Skript aber Run oder RunWait verwendet, um ein Programm (oder ein anderes Skript) zu starten, passiert Folgendes: Solche Programme erben die Umgebungsvariablen des übergeordneten Skripts, inklusive private Umgebungsvariablen.

In v1.0.43.08+ ist es ratsam, Umgebungsvariablen wie Path zukünftig wie folgt abzurufen:

EnvGet, AusgabeVar, Path  ; Zur Erläuterung, siehe #NoEnv.

Kapazität und Speicher einer Variable