AutoHotkey, Teil 2

Schleifen, Abfragen und Variablen mit AHK

| Autor / Redakteur: Mirco Lang / Stephan Augsten

Aus der Programmierung bekannte Kontrollstrukturen wie if-Bedingungen lassen sich auch mit AHK umsetzen.
Aus der Programmierung bekannte Kontrollstrukturen wie if-Bedingungen lassen sich auch mit AHK umsetzen. (© Marek - stock.adobe.com)

AutoHotkey kann mehr als nur Hotkeys. Mit extrem einfacher Syntax lassen sich auch Programmier-Basics umsetzen: Flusskontrolle mit Schleifen und Abfragen sowie die Verwendung von Variablen. Zum Einstieg widmen wir uns aber erst einmal programmabhängige HotKeys.

Im ersten Teil der AutoHotkey-Serie haben Sie ein paar erste Code-Häppchen gesehen, mit denen Sie Tasten neu belegen und systemweite Hotkeys erstellen können. Zur Erinnerung: Um Notepad mit dem Kürzel „STRG+ALT+SHIFT+WIN+N“ zu starten, genügt der Code „^!+#n::run notepad.exe“.

Tastenkürzel für das System sind nett, viel spannender sind aber Kürzel für einzelne Programme, die nur aktiv sind, wenn Sie auch wirklich gerade in diesem Programm arbeiten. Über eine spezielle if-Abfrage ist das kein Problem – und hier finden wir einen schönen Einstieg in diesen zweiten Teil.

AutoHotkey kann wie gesagt sehr gut mit Fenstern, zu denen Sie im nächsten Teil der Serie mehr lesen. Aber auch hier soll eine erste Fensterfunktion als Einstieg in die Abfragen dienen. Um Hotkeys programmabhängig zu machen, können Sie AutoHotkey einfach prüfen lassen, ob das gewünschte Programmfenster aktuell aktiv, also im Vordergrund ist und nur dann die Tastenkürzel aktivieren:

; Kürzel für Gimp
#ifWinActive, ahk_exe gimp-2.10.exe
{
   ^#v::
   SendInput ^v
   SendInput ^h
   return
   XButton1::^n
}
#if

Zunächst sehen Sie, dass Kommentare über ein Semikolon eingeleitet werden – auch hilfreich. Es folgt die if-Abfrage „ifWinActive“, die fragt, ob das angegebene Fenster just im Vordergund ist. Die Identifikation des Fensters funktioniert in diesem Fall über die Variable „ahk_exe“, die schlicht den Namen der Programmdatei eines Fensters beinhaltet, hier also „gimp-2.10.exe“.

Es gibt auch noch andere, präzisere Möglichkeiten, Fenster anzusprechen, die Sie im nächsten Teil kennen lernen. Die letzte Zeile dient als gutes Beispiel für die Einfachheit der AutoHotkey-Syntax: Die if-Abfrage wird ganz einfach per „#if“ geschlossen. Die Aktionen werden komplett in geschweifte Klammern gefasst; wird nur eine Aktion ausgeführt, kann man sich auch das sparen.

Dazwischen sehen Sie fast nur Bekanntes: Zunächst wird für das Kürzel STRG+WIN+V festgelegt, dass erst STRG+V und dann STRG+H ausgeführt wird. Damit würde in Gimp erst eingefügt und dann verankert, sprich man kann Inhalte direkt in einen vorhandenen Layer einfügen.

Abgeschlossen wird in AutoHotkey immer mit „return“ – schließlich sollen nur diese beiden Befehle ausgeführt werden. Danach wird nämlich noch ein weiterer Hotkey definiert, der schlicht STRG+N auf die Daumen-Taste der Maus legt.

Damit ist das Thema Hotkeys im Grunde abgeschlossen: Sie können systemweite oder programmabhängige Tasten- und Maustastenkürzel erstellen, die einzelne Aktionen oder ganze Makros laufen lassen. Und gerade Entwickler können bereits mit diesen wenigen Syntaxelementen enorm an ihrer Produktivität arbeiten und doppelte Tipparbeit massiv einschränken.

Schnelltester: MsgBox

Bevor jetzt weitere Abfragen folgen, sollten Sie zunächst die Message Box kennenlernen: Über MsgBox können Sie einen einfachen Standard-Windows-Dialog aufrufen, der per Default lediglich einen OK-Button und Text zeigt, optional unter anderem die Button-Paare Yes/No und OK/Cancel enthalten kann, um Nutzerentscheidungen zu berücksichtigen.

Vor allem ist die Box aber auch ein gutes Helferlein zum Testen von Code, hier eben von Abfragen: Je nach Ausgang einer Abfrage, erscheint dann schlicht so ein Dialogfenster mit kurzem Hinweistext – die einfachst mögliche Aktion.

Ein simpler, mit MsgBox realisierter Ja/Nein-Dialog.
Ein simpler, mit MsgBox realisierter Ja/Nein-Dialog. (Bild: Lang / AutoHotkey)

Der Standardaufruf ist wieder simpel: „msgbox Hallo Welt“. Ein Ja/Nein-Dialog mit dem Fenstertitel „Testfenster“ und dem Text „Hallo Welt“ bekommt man über den Aufruf „MsgBox, 4, Testfenster, Hallo Welt“. Die „4“ legt dabei den Typen fest – alle Codes zum MsgBox-Kommando finden Sie auf der Autohotkey-Webseite.

Nebenbei: Die Parameter solcher Funktionen können Sie natürlich auch weglassen. Sollte das Fenster beispielsweise keinen eigenen Fenstertitel bekommen, wäre der Aufruf „MsgBox, 4, , Hallo Welt“. Dieses Prinzip funktioniert überall in AutoHotkey.

Abfragen, Schleifen und Variablen

Allgemeine Wenn-Dann-Abfragen unterscheiden sich kaum von der oben genutzten ifWinActive-Abfrage und verwenden dermaßen wenig, simple Syntax, dass es an Pseudo-Code grenzt – ein Beispiel:

; Simple if-else-Abfrage
if (x = 5)
   MsgBox X ist 5
else if (x = 10)
   MsgBox X ist 10
else
{
   MsgBox X ist weder 5 noch 10
   MsgBox Ein zweiter Dialog ...
}
MsgBox Ende

Was hier passiert, dürfte klar sein: Über „if“ wird eine erste Bedingung formuliert und diese Statements gehören in runde Klammern; die zugehörige Aktion (MsgBox) wird ohne weitere Syntax angegeben. Weitere Bedingungen werden über „else if“ eingeleitet und alle sonstigen Fälle über „else“ abgehandelt.

Wie bereits oben gezeigt, werden mehrere Aktionen, hier zwei MsgBox-Aufruf nacheinander, in geschweifte Klammern gefasst. Die Abfrage würd in diesem Fall immer die else-Aktion auslösen – weil X noch gar nicht definiert, und damit auch weder 5 noch 10 ist.

X wurde bis auf 5 heruntergezählt, hier ist das letzte Fenster zu sehen.
X wurde bis auf 5 heruntergezählt, hier ist das letzte Fenster zu sehen. (Bild: Lang / AutoHotkey)

Es fehlt also noch die Definition von X. Und damit nicht immer das gleiche passiert, fehlt auch noch eine Schleife, in der X hochgezählt wird. Die einfachste Variante einer Schleife in AutoHotkey ist „Loop“, die den in geschweiften Klammern eingeschlossenen Code entweder so lange ausführt, bis sie durch „break“ gebrochen wird oder schlicht eine fixe Anzahl an Durchgängen (etwa „loop, 3“).

Der folgende Code zeigt so lange MsgBox-Fenster mit dem Text „X ist ...“ an, bis X irgendwann den Wert 5 annimmt. Dafür wird X hoch- oder runtergezählt, je nach Ausgangswert:

x = 10
loop
{
   if (x = 5)
   {
      MsgBox X ist jetzt 5 - Ende.
      break
   }
   else if (x > 5)
   {
      MsgBox X ist %x%.
      x := x-1
   }
   else
   {
      MsgBox X ist %x%.
      x++
   }
}

Was ist hier neu? Die loop-Schleife beschränkt sich tatsächlich auf die Syntax „loop {}“, mehr gibt es da gar nicht zu lernen. Spannender ist eigentlich der Umgang mit der Variablen X.

Angabe von Variablen

Die einfachste Art der Deklaration in AutoHotkey ist „x = 1“ und die Standardausgabe erfolgt über die Variable in Prozentzeichen, also „%x%“. Das Hochzählen der Variablen können Sie über mehrere Befehle erledigen.

Das altbekannte „x++“ funktioniert ebenso wie „x := x+1“. Was nicht funktioniert ist „x = x+1“. AutoHotkey kennt zwei verschiedene Möglichkeiten, Variablen Werte zuzuweisen. Das ist anfangs etwas verwirrend, kenn man aber das Prinzip, sollte es keine Probleme machen.

Die sogenannte Legacy-Methode ordnet wörtliche Zeichenketten ohne Anführungszeichen, Zahlen und Variablenwerte in Prozentzeichen zu, also zum Beispiel:

x = 5
MeinText = Das ist mein Text.
KopieVonX = %x%

Die Ausgabe erfolgt dann zum Beispiel über:

MsgBox KopieVonX hat den Wert %KopieVonX%
MsgBox %MeinText%

Alternativ gibt es die Expression-Methode, bei der Ausdrücke wie Texte in Anführungszeichen, Zahlen oder Variablenwerte per Doppelpunkt-Gleich-Operator übergeben werden:

x := 5
MeinText := "Das ist mein Text."
KopieVonX := x

Die Ausgabe wäre hier dann:

MsgBox % "KopieVonX hat den Wert" . KopieVonX . "."
MsgBox % MeinText

Standardmäßig verwenden alle Kommandos die Legacy-Methode, daher wird bei der MsgBox mit "% " (Prozentzeichen+Leer) auf die Expression-Methode gewechselt. Dann folgt wörtlicher Text in Anführungszeichen. Der Punkt wird genutzt, um zwei Zeichenketten zu konkatenieren und muss zwischen Leerzeichen stehen.

Die Variable „KopieVonX“ wird nun ohne Prozentzeichen angegeben. Den Abschluss bildet ein Punkt in Anführungszeichen. Wichtig: Achten Sie auf die englischen Anführungszeichen – die Angabe „Hallo Text“ funktioniert nicht , es muss "Hallo Text" heißen!

AutoHotkey empfiehlt die Expression-Methode, da sie klarer sei und der Syntax anderer Sprachen entspricht. Wichtig ist es vor allem, diesen Unterschied zu kennen. Denn wenn Sie Projekte vor allem per Cut&Paste aus externen Quellcodes, Snippets oder Forenbeiträgen zusammenstellen, schleichen sich da schnell Fehlerchen ein.

Nochmal zum Beispiel von oben: „x = x+1“ funktioniert nicht – aber „x = % x+1“ funktioniert sehr wohl, da das Prozentzeichen zur Expression-Methode wechselt und der Ausdruck dann wieder „x := x+1“ entspricht. Ein letztes Beispiel zur Verdeutlichung – das Leeren einer Variablen:

Legacy-Methode: x =
Expression-Methode: x := ""

Eine Liste der möglichen Autohotkey-Operationen rund um die Variablen steht ebenfalls auf der Projektseite bereit. Unter dem Link finden Sie auch eine beträchtliche Zahl an fix eingebauten Variablen, die in AutoHotkey allesamt mit „A_“ beginnen.

Dazu gehören beispielsweise Skripteigenschaften wie Arbeitsverzeichnis (A_WorkingPath) oder aktuell ausgeführte Funktion (A_ThisFunc), Datums- und Zeitangaben wie Monat als Ziffer (A_MM) oder als voller Name (A_MMMM), Skripteinstellungen wie Kritikalität von Threads (A_IsCritical), GUI-Daten wie die Größe (A_GuiHeight) und so weiter. Auch viele Systemvariablen sind hier zu finden, also etwa das Programmverzeichnis (A_ProgramFiles) oder der Autostart-Ordner (A_Startup). Zum Testen genügt wieder ein simples „MsgBox % A_Startup“ beziehungsweise „MsgBox %A_Startup%“.

Zu Variablen ist damit fast alles gesagt, aber es gibt natürlich neben if-Abfrage und loop-Schleife noch weitere Funktionen für die Flusskontrolle.

Weitere Tools für die Flusskontrolle

Zunächst mal ist anzumerken, dass die loop-Schleife noch weitere spannende Funktionen bietet: Über „Loop, Files“ können Ordner und Dateien durchforstet und über „Loop, Parse“ Zeichenketten geparst werden, „Loop, Read“ liest Dateiinhalte und „Loop, Reg“ durchsucht die Registry.

Darüber hinaus gibt es natürlich auch For- und While-Schleifen, den Goto-Befehl, um an eine bestimmte Stelle im Code zu springen, diverse Ausstiegsmöglichkeiten (Return, Exit, ExitApp, Break, Until), Fehlerkontrolle (OnError) sowie Try-Catch-Statements, um Kommandos und Ausdrücke gegen Laufzeitfehler abzusichern – inklusive eines Befehls „Finally“, der garantiert, dass unabhängig vom Ausgang eines Try-Catch-Statements weitere Funktionen ausgeführt werden.

Wenn Sie die grundlegende Syntax der Loop-Schleife, AutoHotkeys Umgang mit Variablen und die eingebauten Variablen kennen, werden Sie die exakte Nutzung der sonstigen Schleifen und Abfragen mit einem Blick in die extrem gute AutoHotkey-Referenz nachvollziehen können.

Im nächsten Teil wird es dann vor allem um zwei Dinge gehen: Fenster manipulieren und GUIs bauen. Zudem kommt ein alternatives Kontrollwerkzeug zur MsgBox hinzu: Schreiben und Live-überwachen von Dateien. Als kleiner Teaser: FileAppend trifft auf Notepads „tail -f“-Funktion.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45570633 / IDEs & Programmiersprachen)