Variablen und Ausdrücke

Inhaltsverzeichnis

Variablen

Variablentypen: AutoHotkey besitzt keine explizit definierten Variablentypen. Allerdings wird eine Variable, die nur Ziffern enthält (optional mit einem Dezimalpunkt), bei einer mathematischen Operation oder bei einem Vergleich automatisch als Zahl interpretiert. Zur Verbesserung der Performance werden die Zahlen intern zwischengespeichert, um Konvertierungen von/in Zeichenketten zu vermeiden.

Gültigkeitsbereiche und Deklarationen von Variablen: Mit Ausnahme von lokalen Variablen in Funktionen sind alle Variablen global; das heißt, dass deren Inhalte jederzeit vom Skript 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 (zudem sind sie anfangs leer).

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 sollten die Namen der Variablen nur Buchstaben, Zahlen und Unterstriche enthalten (zum Beispiel: PositionZeiger, Gesamt_Elemente und Eintrag_ist_gültig). Wenn du dich an solchen Richtlinien hältst, können andere Programmierer dein Skript besser verstehen. Außerdem erhöht das die Chance, dass du mit deinen eigenen Skripten besser zurechtkommst, wenn du sie erneut lesen musst.

Variablennamen, die nur aus Ziffern bestehen, sind prinzipiell nur bei eingehenden Befehlszeilenparametern von Bedeutung. Innerhalb von Ausdrücken werden Ziffern nicht als Variablen interpretiert, weil sie zum Berechnen eines Wertes dienen.

Innerhalb von Ausdrücken sind Variablennamen wie AND, OR und NOT ungeeignet, weil sie als Operatoren interpretiert werden. Das Verwenden solcher Namen innerhalb eines Ausdrucks würde eine angemessene Evaluierung verhindern.

Speichern von Variablenwerten: Es gibt zwei Methoden, wie eine Zeichenkette oder Zahl in eine Variable gespeichert werden kann: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode werden Werte via Gleichheitszeichenoperator (=) gespeichert. Solche Werte können ohne Anführungszeichen versehene Zeichenketten und in Prozentzeichen gesetzte Variablen sein. Zum Beispiel:

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

Bei der Ausdrucksmethode werden Werte via Doppelpunkt-Gleich-Operator (:=) gespeichert. Solche Werte können Zahlen, in Anführungszeichen gesetzte Zeichenketten und andere Arten von Ausdrücken sein. Funktionsgemäß sind die folgenden Beispiele mit den vorherigen Beispielen identisch:

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

Die letztere Methode wird von vielen bevorzugt, weil sie aufgrund ihrer Ausdruckssyntax flexibler ist - sie ist mit der Syntax vieler anderer Sprachen vergleichbar.

Natürlich gibt es auch zwei Methoden, wie man den Inhalt einer Variable löschen kann (um sie sozusagen leer zu machen):

MeineVar =
MeineVar := ""

Die obigen Anführungszeichen sollten nur bei dem Operator ":=" verwendet werden. Wären sie bei dem Operator "=" angegeben, würden zwei Anführungszeichen direkt in die Variable gespeichert werden.

Abrufen von Variablenwerten: Wie beim Speichern von Werten auch, gibt es zwei Methoden zum Abrufen von Werten: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode müssen die Namen der Variablen mit Prozentzeichen umschlossen werden, um ihre Inhalte abrufen zu können. Zum Beispiel:

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

Bei der Ausdrucksmethode müssen die Prozentzeichen weggelassen und Zeichenketten in Anführungszeichen gesetzt werden. Funktionsgemäß sind die folgenden Beispiele mit den vorherigen Beispielen identisch:

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

Bei der oberen MsgBox-Zeile kann man sehen, dass der Traditionsmodus des Parameters mithilfe eines Prozent- und Leerzeichens in den Ausdrucksmodus geändert wurde. Im Normalfall verwenden alle Befehle den Traditionsmodus (wenn nicht anders beschrieben). Allerdings sind bestimmte Parameter einiger Befehle in der Lage, Ausdrücke zu akzeptieren - in diesem Fall sind führende Prozentzeichen erlaubt, aber nicht notwendig. Funktionsgemäß sind die folgenden drei Beispiele identisch, da Sleep's erster Parameter auch ein Ausdruck sein kann:

Sleep MillisekundenWarten
Sleep %MillisekundenWarten%
Sleep % MillisekundenWarten

Vergleichen von Variablen: Bitte lies dir den folgenden Abschnitt genau durch, wie auf welche Weise Vergleiche durchgeführt werden können, insbesondere darüber, wann und wo die Klammern notwendig sind.

Ausdrücke

Ausdrücke sind nützlich, um eine oder mehrere Operationen an Variablen, literalen Zeichenketten und/oder literalen Zahlen durchzuführen.

Innerhalb eines Ausdrucks werden Variablennamen nicht mit Prozentzeichen umschlossen (nur bei Pseudo-Arrays und anderen Doppelverweisen). Demzufolge müssen literale Zeichenketten in Anführungszeichen gesetzt werden, wenn sie nicht als Variablen interpretiert werden sollen. Zum Beispiel:

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

Im obigen Beispiel kann man sehen, dass "Blau" in Anführungszeichen gesetzt wurde, weil es als Zeichenkette interpretiert werden soll. Das folgende Beispiel zeigt, wie mit zwei aufeinanderfolgenden Anführungszeichen ein tatsächliches Anführungszeichen in eine literale Zeichenkette eingefügt werden kann: "Sie sagte: ""Ein Apfel täglich.""".

Wichtig: Eine Ausdrucks-if-Anweisung, deren erstes Zeichen nach dem "if" eine öffnende Klammer ist, unterscheidet sich von einer Traditions-if-Anweisung wie If GefundeneFarbe <> Blau. Eine if-Anweisung wird als Ausdruck angesehen, wenn sie entweder vollständig von Klammern umschlossen ist oder wenn man so etwas wie if (x > 0) and (y > 0) schreibt. Die öffnende Klammer kann man weglassen, wenn das erste Element nach dem "if" ein Funktionsaufruf oder ein Operator wie "not" oder "!" ist.

Leere Zeichenketten: Mithilfe von zwei aufeinanderfolgenden Anführungszeichen kann eine leere Zeichenkette in einem Ausdruck angegeben werden. Zum Beispiel wäre die Anweisung if (MeineVar <> "") wahr, wenn MeineVar nicht leer ist. In einer Traditions-if-Anweisung werden zwei aufeinanderfolgende Anführungszeichen allerdings literal behandelt. Zum Beispiel wäre die Anweisung if MeineVar = "" nur wahr, wenn MeineVar genau diese zwei Zeichen enthält. Möchte man bei einer Traditions-if-Anweisung überprüfen, ob die Variable leer ist, genügt es, nach der Variable ein = oder <> anzugeben: if Var =.

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

Speichern eines Ausdruckwertes: 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: Bei einem Ausdruck, der als wahr oder falsch gewertet werden muss (z. B. bei einer IF-Anweisung), wird ein leerer Wert oder ein Wert mit Null als falsch angesehen und die restlichen Werte als wahr. Zum Beispiel wäre die Anweisung if Elementzählung nur falsch, wenn Elementzählung leer oder 0 ist. Der Ausdruck if not Elementzählung würde das Gegenteil zurückgeben.

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

Done := A_Index > 5 or Gefunden

Wie es bereits oben angedeutet wurde, enthält eine Variable einen falschen Wert, sobald sie leer gemacht oder ihr eine 0 zugewiesen wird. So könnte man mit einer einfachen Anweisung wie if Done überprüfen, ob die Done-Variable wahr oder falsch ist.

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

Zeichengenauigkeit := false
Weitersuchen := true

Integer und Gleitkommazahlen: Innerhalb eines Ausdrucks werden Zahlen mit Dezimalpunkt als Gleitkommazahlen angesehen; pure Zahlen sind Integer. Bei den meisten Operatoren -- wie Addition und Multiplikation -- gilt: Wenn einer der Eingabewerte eine Gleitkommazahl ist, wird das Ergebnis auch eine Gleitkommazahl sein.

Innerhalb von Ausdrücken und auch sonst können Zahlen entweder 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. Seit v1.0.46.11 werden Gleitkommazahlen in wissenschaftlicher Schreibweise erkannt, sofern sie einen Dezimalpunkt enthalten (z. B. 1.0e4 und -2.1E-4).

Erzwingen eines Ausdrucks: Im Normalfall unterstützen Befehlsparameter keine Ausdrücke (außer AusgabeVar-Parameter). Durch Voranstellen eines Prozentzeichens und Leer- oder Tabulatorzeichens kann man die Auswertung eines Ausdrucks erzwingen. Seit [v1.1.21+] kann dieses Präfix in allen EingabeVar-Parametern verwendet werden, außer bei Traditions-IF-Befehlen (verwende stattdessen If (Ausdruck)). Mit dieser Technik greift man häufig auf Arrays zu. 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 mit gleichwertiger Priorität, wie z. B. Multiplizieren (*) und Dividieren, (/), werden von links nach rechts ausgewertet, sofern nicht anders unten angegeben. Ein Operator mit niedrigerer Priorität, wie z. B. Addieren (+), wird erst ausgewertet, wenn ein höherer Operator, wie z. B. Multiplizieren (*), ausgewertet wurde. Zum Beispiel würde 3 + 2 * 2 wie 3 + (2 * 2) ausgewertet werden. Mit runden Klammern können die Prioritäten wie folgt überschrieben werden: (3 + 2) * 2

In der Regel werden leere Werte (leere Zeichenketten) oder nicht-numerische Werte bei einer mathematischen Operation nicht als Null angesehen. Stattdessen werden sie als Fehler behandelt - der Fehler bewirkt, dass dieser Teil des Ausdrucks eine leere Zeichenkette zurückgibt. Wenn beispielsweise eine Variable namens X leer wäre, würde der Ausdruck X+1 einen leeren Wert statt eine 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, demzufolge werden Ausdrücke wie "0x" n einen nicht-numerischen Wert erzeugen (selbst wenn n gültige hexadezimale Ziffern enthält). Dieses Problem kann man umgehen, indem man den Wert in eine Variable speichert oder ihn via Funktion, wie z. B. Round(), übergibt. Skripte sollten keine in Anführungszeichen gesetzte literale Zahlen enthalten, 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 der gesamte Inhalt dieser Variable als Name oder Teilname einer anderen Variable angesehen (wenn es so eine Variable nicht gibt, wird %Var% in eine leere Zeichenkette aufgelöst). Meistens verwendet man diese Methode bei Pseudo-Array-Elemente, z. B:

Var := MeinArray%A_Index% + 100

Aus Gründen der Abwärtskompatibilität werden Befehlsparameter, die als "kann ein Ausdruck sein" dokumentiert sind, die Prozentzeichen bei einem Verweis (z. B. %Var%, aber nicht Array%i%) ignorieren, als wären sie nicht vorhanden. Umschließe den Verweis mit runden Klammern, wenn dieses Verhalten verhindert werden soll; z. B. Sleep (%Var%).

[AHK_L 52+]: Absofort kann %Var%, neben den normalen Variablen, in eine Umgebungsvariable, Zwischenablage oder reservierte/schreibgeschützte Variable aufgelöst werden. Vor Revision 52 gab %Var% in solchen Fällen eine leere Zeichenkette zurück.

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 literaler Wert sein. Siehe Objekt-Syntax.
new [v1.1.00+]: Erstellt ein neues Objekt, das von einem anderen Objekt abgeleitet wird. 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). Um mehr darüber zu erfahren, siehe Benutzerdefinierte Objekte.
++
--
Pre- und Post-Inkrement/Dekrement. Addiert oder subtrahiert eine Variable mit 1 (vor Version 1.0.46 konnten nur sie selbst auf einer Zeile verwendet werden; anderen Operatoren durften nicht vorhanden sein). Der Operator kann entweder vor oder hinter dem Variablennamen erfolgen. Erfolgt der Operator vor dem Namen, wird die Operation sofort durchgeführt und ihr Ergebnis für die nächste Operation bereitgestellt. Zum Beispiel würde Var := ++X die X-Variable sofort erhöhen und ihr Wert in Var speichern. Erfolgt der Operator hinter dem Variablennamen, wird die Operation erst nach der nächsten Operation durchgeführt. Zum Beispiel würde Var := X++ die X-Variable erst erhöhen, wenn der aktuelle Wert von X in Var gespeichert wird. Aufgrund der Abwärtskompatibilität behandeln diese Operatoren leere Variablen als Null, sofern sie alleine auf einer Zeile vorkommen; 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 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 eine literale negative Zahl demzufolge potenzieren zu können, muss sie in 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 (-): Auch wenn dieser Operator genauso aussieht wie der Subtraktionsoperator - einstellige Minuszeichen können nur bei einzelnen Elementen oder Teilausdrücken angefügt werden: -(3 / -x). Einstellige Pluszeichen (+) innerhalb eines Ausdrucks werden ignoriert.

Logisches NICHT (!): Ist der Operand leer oder 0, wird das Ergebnis mit einem logischen NICHT 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 gleiche wie !, aber ! hat eine höhere Priorität. Seit v1.0.46 sind aufeinanderfolgende einstellige Operatoren wie !!Var erlaubt, weil sie von rechts nach links ausgewertet werden.

Bitweises NICHT (~): Invertiert jedes Bit seines Operanden. Ist der Operand eine Gleitkommazahl, wird er vor der Berechnung auf einen Integer gekürzt. Liegt der Operand 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 ermittelt die Adresse des Speicherinhalts von MeineVar. Solche Adressen sind üblicherweise bei DllCall-Strukturen nützlich. &MeineVar deaktiviert außerdem das Caching von Binärzahlen in dieser Variable, und verringert dadurch ihre Performance, falls sie jemals bei mathematischen oder numerischen Vergleichen einbezogen wird. Das Caching einer Variable wird reaktiviert, wann immer sich ihre Adresse ändert (z. B. via VarSetCapacity()).

Dereferenzierung (*): *Ausdruck geht davon aus, dass Ausdruck in eine numerische Speicheradresse aufgelöst wird; es ermittelt das Byte auf dieser Adresse als eine Zahl zwischen 0 und 255 (0 wird immer 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() zum Abrufen von binären Zahlen besser geeignet.

*
/
//

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 zurückgeben, 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 Doppel-Schrägstrich-Operator verwendet die leistungsstarke 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 Gleitkommazahl ist, wird die Gleitkomma-Division erfolgen und das Ergebnis auf den nächstmöglichen linksbefindlichen Integer gekürzt. Zum Beispiel wäre 5//3.0 gleich 1.0 und 5.0//-3 gleich -2.0. Das Ergebnis wird im Gleitkommaformat gespeichert, selbst wenn das Ergebnis dieser Gleitkomma-Division ein Integer ist. Für Modulo, siehe Mod().

Die Operatoren *= und /= sind eine Kurzschreibweise, um den Wert in einer Variable mit einem anderen Wert zu multiplizieren oder dividieren. Zum Beispiel würde Var *= 2 das gleiche Ergebnis wie Var := Var * 2 erzeugen (die erste Methode ist performanter).

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

+
-

Addieren (+) und Subtrahieren (-). Die Operatoren += und -= sind eine Kurzschreibweise zum Erhöhen oder Verringern einer Variable. Zum Beispiel würde Var += 2 das gleiche Ergebnis wie Var := Var + 2 erzeugen (die erste Methode ist performanter). Desweiteren kann mit Var++, Var--, ++Var oder --Var eine Variable auf einfache Weise um 1 erhöht oder verringert werden.

<<
>>
Bitweise Verschiebung nach links (<<) und nach rechts (>>). Anwendungsbeispiel: Wert1 << Wert2. Jeder Eingabewert im Gleitkommaformat wird zu einem Integer gekürzt, bevor die Berechnung erfolgt. 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 das Ergebnis dann auf den nächstmöglichen Integer auf der Zahlenreihe 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 zu einem Integer gekürzt, bevor die Berechnung erfolgt.
.

Verkettung. Mit dem Punkt-Operator können zwei Elemente zu einer Zeichenkette kombiniert werden (auf beiden Seiten des Punktes muss mindestens ein Leerzeichen vorkommen). Den Punkt kann man weglassen, um das gleiche zu erreichen (außer bei Zweideutigkeiten wie x -y, oder wenn das rechtsbefindliche Element ein ++ oder -- davor hat). Fehlt der Punkt, sollte mindestens ein Leerzeichen zwischen den Elementen vorhanden sein, die zusammengeführt werden sollen.
Beispiel (Ausdrucksmethode): Var := "Die Farbe ist " . GefundeneFarbe
Beispiel (Traditionsmethode): Var = Die Farbe ist %GefundeneFarbe%

Teilausdrücke kann man auch verketten. Zum Beispiel: Var := "Der Nettopreis ist " . Preis * (1 - Rabatt/100).

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

~= [AHK_L 31+]: Kurzschreibweise für RegExMatch. Zum Beispiel würde "abc123" ~= "\d" den ErrorLevel auf 0 setzen und 4 zurückgeben (die Position des ersten numerischen Zeichens). Bevor v1.1.03 veröffentlicht wurde, hatte dieser Operator die gleiche Priorität wie der Gleichheitsoperator (=), und fehlte in der Dokumentation.
>   <
>= <=
Größer (>), kleiner (<), größer gleich (>=) und kleiner gleich (<=). Wenn einer der beiden Eingabewerte keine Zahl ist, werden sie alphabetisch verglichen (in diesem Kontext wird eine in Anführungszeichen gesetzte Zeichenkette wie "55" immer als nicht-numerisch angesehen). Der Vergleich unterscheidet nur zwischen Groß- und Kleinschreibung, wenn StringCaseSense aktiviert ist. Siehe auch: Sort
=
==
<> !=
Gleich (=), zeichengenau gleich (==) und ungleich (<> oder !=). Funktionsgemäß sind die Operatoren != und <> identisch. Die Operatoren == und = verhalten sich gleich. Sobald jedoch einer der Eingabewerte eine Zeichenkette ist, wird == zwischen Groß- und Kleinschreibung unterscheiden, während = dies nicht tut (die Nichtunterscheidungsmethode ist abhängig von StringCaseSense). Die Operatoren <> und != berücksichtigen StringCaseSense. Hinweis: In diesem Kontext wird eine in Anführungszeichen gesetzte Zeichenkette wie "55" immer als nicht-numerisch angesehen.
NOT Logisches NICHT. Abgesehen von seiner geringeren Priorität, ist dieser Operator funktionsgemäß identisch mit dem !-Operator. Zum Beispiel wäre not (x = 3 or y = 3) das gleiche wie !(x = 3 or y = 3).
AND
&&
Beide 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 ein beliebig anderer Operator) beginnt, wird automatisch mit der darüberliegenden Zeile verbunden.
OR
||
Beide 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 die Kurzschreibweise für eine if-else-Anweisung. Der Operator wertet die Bedingung auf seiner linken Seite aus, um festzustellen, welche der beiden Verzweigungen das Endergebnis sein soll. Zum Beispiel würde Var := x>y ? 2 : 3 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 (bevor die Version 1.0.46 veröffentlicht wurde, konnten sie als Operator nur ganz links auf der Zeile stehen, zudem wurden nur die ersten fünf Operatoren unterstützt). Der einfachste Zuweisungsoperator ist das Doppelpunkt-Gleich (:=) - dieser Operator kann das Ergebnis eines Ausdrucks in eine Variable speichern. Da sie eine Kurzschreibweise eines Operators ist, findest du ihre Beschreibung jeweils beim dazugehörigen Operator in dieser Tabelle. Beispiel 1: Var //= 2 führt eine Floor-Division durch, um Var mit 2 zu teilen, und speichert dann das Ergebnis wieder in Var. Beispiel 2: Var .= "abc" ist die Kurzschreibweise für Var := Var . "abc".

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

Verwendet man eine Zuweisung als Eingabewert eines anderen Operators, wird ihr Wert die Variable selbst sein. Zum Beispiel wäre der Ausdruck (Var += 2) > 50 wahr, wenn der gerade eben erhöhte Wert in Var größer als 50 ist. Mit diesem Verfahren könnte man auch eine Zuweisung via ByRef übergeben oder ihre Adresse verwenden; 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: Die Auswertung von not x := y entspräche not (x := y), ++Var := X entspräche ++(Var := X); und Z > 0 ? X := 2 : Y := 2 entspräche Z > 0 ? (X := 2) : (Y := 2).

Bekannte Einschränkungen durch Abwärtskompatibilität (die in einer zukünftigen Version behoben werden): 1) Wenn /= als Operator ganz links in einem Ausdruck steht und nicht zu einer Mehrfachanweisung gehört, erfolgt die Floor-Division, sofern keiner der Eingabewerte eine Gleitkommazahl ist (ansonsten wird /= die echte Division durchführen); 2) Datum/Zeit-Berechnung wird von += und -= nur unterstützt, wenn dieser Operator ganz links auf der Zeile vorkommt; 3) Die Operatoren +=, -= und *= behandeln leere Variablen als 0, solange sie einzeln auf einer Zeile vorkommen; zum Beispiel würde sowohl y := 1, x += 1 als auch MsgBox % x -= 3 ein leeres Ergebnis erzeugen, falls x leer ist.

,

Komma (mehrere Anweisungen) [v1.0.46+]. Kommas können verwendet werden, um mehrere Teilausdrücke nebeneinander zu setzen. Es ist eine häufig eingesetzte Methode, 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.

Seit v1.0.46.01 gilt: Wenn direkt nach einem Komma eine Variable und ein Gleichheitszeichen erfolgt, verhält sich dieses Gleichheitszeichen automatisch wie eine Zuweisung (:=). Zum Beispiel wären alle folgenden Elemente Zuweisungen: x := 1, y = 2, a = b = c. Neue Skripte sollten sich nicht auf dieses Verhalten verlassen, weil es noch geändert werden könnte. Diese Regel gilt nur für reine Variablen und nicht für Doppeldereferenzierungen - das Folgende würde nur eine Zuweisung enthalten: x:=1, %y%=2

mod()
round()
abs()

Diese und andere built-interne mathematischen Funktionen findest du hier.

%func%()

Siehe Dynamisches Aufrufen einer Funktion.
func.()

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

[AHK_L 48+]: Versucht, eine Methode mit leerem Namen 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.

F(p*) [AHK_L 60+]: Siehe Variadische Funktionen.
x[y] [AHK_L 31+]: Objektzugriff. Ruft einen Wert ab, setzt einen Wert oder ruft eine Methode des Objekts x auf. Hierbei kann y eine Parameterliste oder ein berechneter Methodenname sein. Siehe Array-Syntax und Objekt-Syntax.

Performance: Seit v1.0.48 erzielt man häufig bessere Performance, wenn man mehrere aufeinanderfolgende Ausdrücke mit dem Komma-Operator trennt, 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 verbunden 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 kombinieren würde.

Built-in-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 deren Inhalte nicht direkt ä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, wann immer 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). Siehe Befehlszeilenparameter für weitere Details.
A_WorkingDir Das aktuelle Arbeitsverzeichnis, wo das Skript standardmäßig auf Dateien zugreift. Der letzte umgekehrte Schrägstrich ist nicht enthalten, sofern es nicht das Stammverzeichnis ist. 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 Der vollständige Pfad 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 die Zeile aus einer #Include-Datei). Diese Zeilennummer kann man auch in ListLines finden; sie kann nützlich zum Melden eines Fehlers sein, z. B.: MsgBox, Eine Zeile konnte nicht in die Log-Datei geschrieben werden (Zeilennummer %A_LineNumber%)

Die Zeilennummern eines kompilierten Skripts können sich von den Zeilennummern der unkompilierten Version unterscheiden, weil bei der Kompilierung das Skript und seine #Include-Dateien in eine große Skriptdatei umgewandelt werden.

A_LineFile Der vollständige Pfad der Datei, auf der sich A_LineNumber bezieht, und prinzipiell das gleiche ist wie A_ScriptFullPath, sofern die Zeile nicht zu einer #Include-Datei eines unkompilierten Skripts gehört.
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. A_ThisLabel wird aktualisiert, wann immer das Skript Gosub/Return oder Goto ausführt. A_ThisLabel wird auch aktualisiert, wenn automatisch-aufgerufene Labels wie Timer, GUI-Threads, Menüpunkte, Hotkeys, Hotstrings, OnClipboardChange (Label) und OnExit erfolgen. A_ThisLabel wird nicht aktualisiert, wenn die Skriptausführung in eines der oben genannten Label "gelangt"; in diesem Fall behält A_ThisLabel seinen 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 zurückgegeben, mit der das Skript ursprünglich kompiliert worden ist. Aufgrund der Struktur der Versionsnummer kann ein Skript mit ">" oder ">=" überprüfen, ob A_AhkVersion größer als eine bestimmte Versionsnummer ist: if A_AhkVersion >= 1.0.25.07.
A_AhkPath

Bei unkompilierten 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 HKEY_LOCAL_MACHINE\SOFTWARE\AutoHotkey\InstallDir ermittelt. Wenn es so einen Eintrag nicht gibt, wird A_AhkPath leer gemacht.

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 einen Wert, wenn eine OnExit-Subroutine gerade läuft oder bereits einmal aufgrund eines Exitversuchs aufgerufen wurde. Siehe OnExit für weitere Details.

Datum und Zeit

A_YYYY Das aktuelle 4-stellige Jahr (z. B. 2004). Synonym für A_Year. Hinweis: Wenn der Zeit- oder Datumswert in einem Format angezeigt werden soll, das deinem Gebietsschema oder deiner Sprache entspricht, dann verwende FormatTime, AusgabeVar (Zeit und langes Datum) oder FormatTime, AusgabeVar,, LongDate (ermittelt ein Datum im langen Format).
A_MM Der aktuelle zweistellige Monat (01-12). Synonym für A_Mon.
A_DD Der aktuelle zweistellige Tag des Monats (01-31). Synonym für A_MDay.
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). In allen Gebietsschemen ist Tag 1 der Sonntag.
A_YDay Der aktuelle Tag im Jahr (1-366). Der Wert wird nicht mit Nullen aufgefüllt, z. B. wird 9 abgerufen, nicht 009. Ein Wert kann wie folgt mit Nullen aufgefüllt werden: FormatTime, AusgabeVar, , YDay0.
A_YWeek Das aktuelle Jahr + Wochennummer (z. B. 200453) gemäß ISO 8601. Um das Jahr von der Woche zu trennen, verwende StringLeft, Jahr, A_YWeek, 4 und StringRight, Woche, A_YWeek, 2. Genaue Definition von A_YWeek: Wenn die Woche, die den 1. Januar hat, vier oder mehr Tage des neuen Jahres enthält, wird sie als Woche 1 angesehen. Ansonsten ist sie die letzte Woche des vorherigen Jahres und die nachfolgende Woche die Woche 1.
A_Hour Die aktuelle zweistellige Stunde (00-23) im 24-Stunden-Format. Das folgende Beispiel zeigt, wie die Zeit im 12-Stunden-Format sowie die Indikatoren AM bzw. PM abgerufen werden können: 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: Die Berechnung von Datum- und Zeit kann mithilfe von EnvAdd und EnvSub durchgeführt werden. Außerdem kann FormatTime einen Datum- und/oder Zeitwert in einem Format anzeigen lassen, das deinem Gebietsschema oder deiner Sprache entspricht.
A_NowUTC Die koordinierte Weltzeit (UTC) im YYYYMMDDHH24MISS-Format. UTC ist grundsätzlich das gleiche wie Greenwich Mean Time (GMT).
A_TickCount

Ruft die Anzahl der Millisekunden ab, die seit dem Systemstart verstrichen sind. Die verstrichene Zeit kann man messen, indem man A_TickCount in eine Variable speichert und diese Variable dann von dem neuesten A_TickCount-Wert subtrahiert. Zum Beispiel:

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

Schaue dir QueryPerformanceCounter() an, wenn du eine höhere Genauigkeit als die 10 ms von A_TickCount benötigst.

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 direkt unterhalb des aktuellen Threads pausiert wurde. Ansonsten enthält sie eine 0.
A_IsCritical
[v1.0.48+]
Enthält eine 0, wenn Critical im aktuellen Thread ausgeschalten ist. Ansonsten enthält sie ein Integer größer als Null - also die verwendete Nachrichtenüberprüfungsfrequenz von Critical. Da Critical 0 den kritischen Status deaktiviert, kann der aktuelle Status von Critical mithilfe von Alt_IsCritical := A_IsCritical gespeichert und später mit Critical %Alt_IsCritical% wiederhergestellt werden.
A_BatchLines (Synonym für 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 Standardcodierung für verschiedene Befehle; 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. Das Symbol kann mithilfe von #NoTrayIcon oder des Menu-Befehls 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 kann falsch sein, wenn man einen relativen Pfad einer DLL-Systemdatei übergeben hat; zum Beispiel Menu, Tray, Icon, user32.dll, 2.
A_IconNumber Leer, wenn A_IconFile leer ist. Ansonsten enthält diese Variable die Nummer des Symbols von A_IconFile (üblicherweise 1).

Abwesenheit des Benutzers

A_TimeIdle Ruft die Anzahl der Millisekunden ab, die seit der letzten Eingabe (Tastatur, Maus usw.) verstrichen sind. 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. Dieser Wert erhöht sich in der Regel um 10, deshalb sollte man verhindern zu überprüfen, ob er genau mit einem anderen Wert übereinstimmt. Überprüfe 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

Diese Variable verhält sich wie A_TimeIdle, aber ignoriert künstliche Tastatureingaben und/oder Mausklicks, wann immer der entsprechende Hook (Tastatur oder Maus) installiert wird; das heißt, dass die Variable nur auf physische Ereignisse reagiert. Dadurch wird verhindert, dass simulierte Tastatureingaben und Mausklicks fälschlicherweise die Anwesenheit des Benutzers vortäuschen. Wenn beide Hooks fehlen, hat diese Variable die gleiche Bedeutung wie A_TimeIdle. Wenn nur ein einziger Hook installiert ist, werden nur seine physischen Eingaben Einfluss auf A_TimeIdlePhysical haben (der andere/nicht-installierte Hook, sowohl physisch als auch künstlich, hat keine Wirkung).

GUI-Fenster und Menüleisten

A_DefaultGui [v1.1.23+] Name oder Nummer vom Standard-GUI des aktuellen Threads.
A_DefaultListView [v1.1.23+] Variablenname oder HWND des ListView-Steuerelements, auf dem sich die ListView-Funktionen gerade beziehen. Fehlt dem Standard-GUI eine ListView, dann ist diese Variable leer.
A_DefaultTreeView [v1.1.23+] Variablenname oder HWND des TreeView-Steuerelements, auf dem sich die TreeView-Funktionen gerade beziehen. Fehlt dem Standard-GUI eine TreeView, dann ist diese Variable leer.
A_Gui Name oder Nummer des GUI-Fensters, das 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 Das GUI-Steuerelement bzw. der Name seiner zugeordneten Variable, welches den aktuellen Thread gestartet hat. Fehlt dem Steuerelement eine zugeordnete Variable, enthält A_GuiControl stattdessen die ersten 63 Zeichen des Textes/der Bezeichnung (da man meistens den Buttons keine Variablennamen zuordnet). A_GuiControl ist leer, sobald: 1) A_Gui leer ist; 2) ein GUI-Menüleistenpunkt oder Ereignis wie GuiClose/GuiEscape den aktuellen Thread gestartet hat; 3) dem Steuerelement eine zugeordnete Variable und Bezeichnung fehlt; oder 4) das Steuerelement nicht länger vorhanden ist, welches ursprünglich den aktuellen Thread gestartet hat (z. B. durch Gui Destroy).
A_GuiWidth
A_GuiHeight
Diese Variablen enthalten die Breite und Höhe des GUI-Fensters, sofern sie in einer GuiSize-Subroutine verwendet werden. Sie beziehen sich auf den Client-Bereich des GUI-Fensters - das ist der Bereich ohne Titelleiste, Menüleiste und Rahmen. [v1.1.11+]: Diese Werte sind von der DPI-Skalierung abhängig.
A_GuiX
A_GuiY
Diese Variablen enthalten die X- und Y-Koordinaten bei GuiContextMenu- und GuiDropFiles-Ereignissen. Die Koordinaten sind relativ zur linken oberen Ecke des Fensters. [v1.1.11+]: Diese Werte sind von der DPI-Skalierung abhängig.
A_GuiEvent
oder A_GuiControlEvent

Das Ereignis, welches den aktuellen Thread gestartet hat. Wenn dieser Thread von etwas gestartet wurde, das keine GUI-Aktion ist, dann 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 bei Menüleistenelementen und Sonderereignissen wie GuiClose und GuiEscape verwendet.

DoubleClick: Das Ereignis wurde durch einen Doppelklick ausgelöst. Hinweis: Der erste Klick des Doppelklicks löst weiterhin ein Normal-Ereignis aus. Das heißt, dass die Subroutine zweimal gestartet wird: einmal beim ersten Klick und nochmals beim zweiten Klick.

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

Kontextabhängige Werte: Für weitere Details, siehe GuiContextMenu, GuiDropFiles, Slider, MonthCal, ListView und TreeView.

A_EventInfo

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

Hinweis: Im Gegensatz zu Variablen wie A_ThisHotkey behält jeder Thread seinen eigenen Wert für A_Gui, A_GuiControl, A_GuiX/Y, A_GuiEvent und A_EventInfo. Das heißt, dass die ursprünglichen/richtigen Werte auch dann noch zur Verfügung stehen, wenn ein Thread unterbrochen und dann fortgesetzt wird.

Hotkeys, Hotstrings und benutzerdefinierte Menüpunkte

A_ThisMenuItem Der Name des zuletzt ausgewählten benutzerdefinierten Menüpunkts (ansonsten leer).
A_ThisMenu Enthält den Namen des Menüs, wo A_ThisMenuItem ausgewählt wurde.
A_ThisMenuItemPos Eine Nummer, die die aktuelle Position von A_ThisMenuItem in A_ThisMenu kennzeichnet. Der erste Menüpunkt ist 1, der Zweite ist 2 und so weiter. Trennlinien haben auch eine Nummer. Diese Variable ist leer, wenn A_ThisMenuItem auch leer ist oder nicht länger in A_ThisMenu vorkommt. 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 solltest du diesen Wert in eine andere Variable speichern, wenn du ihn später noch brauchst.

Ein Hotkey kann man via Hotkey-Befehl oder Doppelpunkt-Label erstellen. Wenn man ein Hotkey das erste Mal erstellt, wird ihm ein dauerhafter Name zugewiesen, der die aktuelle Taste und Anordnung der Modifkatorzeichen beinhaltet. Diesen Namen teilen sich alle Varianten des Hotkeys.

Siehe auch: A_ThisLabel

A_PriorHotkey Verhält sich wie A_ThisHotkey, aber bezieht sich auf den zuvor ausgeführten Hotkey. Ansonsten ist sie leer.
A_PriorKey [v1.1.01+]: Der Name der vorletzten gedrückten Taste, oder eine leere Zeichenkette, wenn kein geeigneter Tastendruck im Tastenverlauf gefunden werden kann. Alle via Skript erzeugten Eingaben werden ignoriert. Damit diese Variable von Nutzen ist, muss der Tastatur- oder Maus-Hook installiert und der Tastenverlauf aktiviert sein.
A_TimeSinceThisHotkey Ruft die Anzahl der Millisekunden ab, die seit dem letzten Drücken von A_ThisHotkey verstrichen sind. Sie wird -1 sein, wann immer A_ThisHotkey leer ist.
A_TimeSincePriorHotkey Ruft die Anzahl der Millisekunden ab, die seit dem letzten Drücken von A_PriorHotkey verstrichen sind. Sie wird -1 sein, wann immer 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 den Pfad der Windows-Konsole, welcher auch in der ComSpec-Umgebungsvariable zu finden ist (z. B. C:\Windows\system32\cmd.exe). Diese Variable wird oft in Verbindung mit Run/RunWait verwendet. Hinweis: Bei dieser Variable fehlt das Präfix "A_".
A_Temp
[v1.0.43.09+]
Der vollständige Pfad des Ordners, der dazu bestimmt ist, temporäre Dateien zu beinhalten (z. B. C:\DOCUME~1\Benutzername\LOCALS~1\Temp). Dieser Pfad wird von einem der folgenden Standorten abgerufen (in dieser Reihenfolge): 1) Umgebungsvariable TMP, TEMP oder USERPROFILE; 2) Windows-Verzeichnis.
A_OSType Der Typ des aktuell laufenden Betriebssystems. Da AutoHotkey 1.1 nur NT-basierte Betriebssysteme unterstützt, wird das immer WIN32_NT sein. Ältere AutoHotkey-Versionen werden in Windows 95/98/Me WIN32_WINDOWS zurückgeben.
A_OSVersion

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.

Wenn du in den Eigenschaften der AutoHotkey-Datei oder des kompilierten Skripts die Kompatibilitätseinstellungen änderst, wird das Betriebssystem bzw. A_OSVersion eine andere Versionsnummer melden.

[v1.1.20+]: Wenn die Version deines Betriebssystems oben nicht aufgelistet ist, wird eine Zeichenkette im Format "Haupt.Neben.Build" zurückgegeben. Zum Beispiel wäre 10.0.14393 Windows 10 Build 14393, auch bekannt als Version 1607.

; Das folgende Beispiel ist nicht mehr relevant, weil solche Betriebssysteme nicht länger 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 im 64-Bit-Format ist, oder eine 0 (falsch), wenn es im 32-Bit-Format 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 im 32- oder 64-Bit-Format ist.
A_Language Die Standardsprache des Systems als vierstelliger Code.
A_ComputerName Der Netzwerkname des Computers.
A_UserName Der Anmeldename des Benutzers, der das 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)). Diese Built-In-Variable entspricht prinzipiell der Umgebungsvariable ProgramFiles.

Auf 64-Bit-Systemen (und nicht 32-Bit-Systemen) gilt Folgendes:

  • Wenn die skript-ausführende EXE-Datei im 32-Bit-Format ist, gibt A_ProgramFiles den Pfad des Ordners "Programme (x86)" zurück.
  • Bei 32-Bit-Prozessen enthält die Umgebungsvariable ProgramW6432 den Pfad der 64-Bit-Version des Programme-Ordners. In Windows 7 und höher gilt das auch für 64-Bit-Prozesse.
  • Die Umgebungsvariable ProgramFiles(x86) enthält den Pfad der 32-Bit-Version des Programme-Ordners.

Seit v1.0.43.08 kannst du das Präfix "A_" weglassen, um dir den Wechsel auf #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. In Gegensatz zu allen anderen ähnlichen Variablen ist hier der letzte umgekehrte Schrägstrich nicht enthalten, wenn sich der Ordner im Stammverzeichnis eines Laufwerks befindet. Also beispielsweise M: anstatt M:\
A_IsAdmin

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

Mit Run *RunAs kann man das Skript mit Adminrechten neu starten lassen (oder anzeigen lassen, dass der Benutzer Adminrechte benötigt). Beachte aber, dass ein mit Adminrechten gestartetes Skript dazu führt, dass alle Programme, die das Skript startet, auch Adminrechte haben werden. In der FAQ findest du eine mögliche Alternative.

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 man auch den Arbeitsbereich eines Anzeigegeräts ermitteln. Dieser Bereich kann kleiner sein als der Gesamtbereich des Anzeigegeräts, weil die Abmessungen von der Taskleiste und anderen registrierten Desktopsymbolleisten abgezogen werden.

A_ScreenDPI [v1.1.11+] Die Anzahl der Pixel pro logischem Inch entlang der Bildschirmbreite. Bei einem Multi-Anzeigegerät-System gilt dieser Wert für alle Anzeigegeräte. Bei vielen Systemen ist das 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 wird 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 der Texteinfügemarke. Die Koordinaten beziehen sich auf das aktive Fenster. CoordMode kann verwendet werden, um den ganzen Bildschirm einzubeziehen. Wenn es kein aktives Fenster gibt oder wenn die Position der Einfügemarke nicht ermittelt werden kann, sind diese Variablen leer.

Das folgende Skript zeigt dir in einem sich selbst aktualisierenden ToolTip die Position der Einfügemarke an, während du die Einfügemarke verschiebst. Beachte, dass einige Fenster (z. B. bestimmte Versionen von MS Word) immer die gleiche Position der Einfügemarke melden, egal auf welcher Position sie wirklich ist.

#Persistent
SetTimer, BeobachteEinfügemarke, 100
return

BeobachteEinfügemarke:
ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
return
Clipboard Enthält oder ändert den Inhalt der Zwischenablage. 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 findest du in DllCall() und Run/RunWait.

Loop

A_Index Enthält die Nummer des aktuellen Schleifendurchlaufs (ein 64-Bit-Integer). Zum Beispiel enthält diese Variable die Nummer 1, wenn das Skript den Schleifenkörper zum ersten Mal ausführt. Weitere Informationen können in Loop oder While-Schleife gefunden werden.
A_LoopFileName, etc. Diese und andere verwandte Variablen sind nur innerhalb einer Dateimuster-Schleife gültig.
A_LoopRegName, etc. Diese und andere verwandte Variablen sind nur innerhalb einer Registry-Schleife gültig.
A_LoopReadLine Siehe Datei-lesende Schleife.
A_LoopField Siehe Parsende Schleife.

Umgebungsvariablen vs. normale Variablen

Umgebungsvariablen werden vom Betriebssystem verwaltet. Du kannst dir eine Liste von Umgebungsvariablen anzeigen lassen, wenn du in der Windows-Konsole SET eingibst und ENTER drückst.

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; sie können vom Rest des Systems nicht erkannt werden. Bei Programmen (oder Skripten), die via Run oder RunWait gestartet werden, gilt eine Ausnahme: Sie erben sowohl die Umgebungsvariablen des übergeordneten Skripts als auch die privaten Umgebungsvariablen.

Seit v1.0.43.08 ist es empfehlenswert, dass alle neuen Skripte die Umgebungsvariablen wie Path mithilfe des folgenden Beispiels abrufen:

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

Kapazität und Speicher einer Variable