AutoHotkey Anfänger-Tutorial von tidbit

Inhaltsverzeichnis

  1. Die Grundlagen
    1. AutoHotkey herunterladen und installieren
    2. Wie erstellt man ein Skript
    3. Befehle kann man nicht zusammenführen
    4. Wie du die englische Hilfedatei auf deinem Computer finden kannst
  2. Hotkeys & Hotstrings
    1. Tasten und ihre mysteriösen Symbole
    2. Fenster-spezifische Hotkeys/Hotstrings
    3. Mehrere Hotkeys/Hotstrings pro Datei
    4. Beispiele
  3. Senden von Tastatureingaben
    1. Spiele
  4. Starten von Programmen & Webseiten
  5. Befehle vs. Funktionen()
    1. Code-Blöcke
  6. Variablen
    1. Wann und wo Prozentzeichen verwendet werden
    2. Abrufen von Benutzereingaben
    3. Weitere Beispiele
  7. Objekte
    1. Erstellen von Objekten
    2. Verwenden von Objekten
  8. Andere hilfreiche Goodies
    1. Die mysteriösen eckigen Klammern
    2. Herausfinden deiner AHK-Version
    3. Trial-and-Error-Prinzip
    4. Einrückung
    5. Um Hilfe bitten
    6. Andere Links

1 - Die Grundlagen

Bevor wir mit unserer Reise beginnen, habe ich ein paar Ratschläge für dich. Während dieses Tutorials wirst du viel Text und Code sehen. Um AutoHotkey optimal zu lernen, ist es ratsam, den Text zu lesen und die Beispielcodes auszuprobieren. Erst danach solltest du versuchen, die Codes zu analysieren. Die meisten Beispiele auf dieser Seite kannst du kopieren und in deinem Texteditor einfügen. Wenn du einen Abschnitt nicht auf Anhieb verstehst, empfehle ich dir, ihn noch einmal zu lesen.

a. AutoHotkey herunterladen und installieren

Bevor du lernst, wie man AutoHotkey (AHK) nutzt, musst du es herunterladen. Danach muss AHK eventuell installieren werden, je nachdem, welche Version du heruntergeladen hast. In diesem Guide verwenden wir den Installer, da er am einfachsten zu bedienen ist.

Anleitung:

  1. Öffne die Homepage von AutoHotkey: https://autohotkey.com/
  2. Klicke auf Download: https://autohotkey.com/download/ahk-install.exe
  3. Während der Installation von AutoHotkey wirst du aufgefordert, zwischen UNICODE und ANSI zu wählen. Die meisten entscheiden sich für UNICODE. Es unterstützt nicht-englische Buchstaben und Zahlen (Zeichen). Mache weiter, bis du eine Schaltfläche siehst, um AutoHotkey zu installieren.
  4. Sobald das erledigt ist, großartig! Weiter zu Abschnitt b.

Eine Videoanleitung findest du unter Install und Hello World auf YouTube.

b. Wie erstellt man ein Skript

Die folgende Anleitung zeigt, wie man AutoHotkey dazu bringen kann, etwas zu tun. AutoHotkey ist keine Zauberei - wir alle wünschten, es wäre so, ist es aber nicht. Wir müssen AutoHotkey also sagen, was zu tun ist. Diesen Vorgang nennt man "Scripting".

Anleitung:

  1. Klicke mit der rechten Maustaste auf deinem Desktop.
  2. Suche den Menüpunkt "Neu".
  3. Wähle den Menüpunkt "AutoHotkey Script" im Menü "Neu" aus.
  4. Gib dem Skript einen neuen Namen. Der Name muss mit .ahk enden. Zum Beispiel: MeinSkript.ahk
  5. Suche die neu erstellte Datei auf deinem Desktop und klicke mit der rechten Maustaste darauf.
  6. Wähle den Menüpunkt "Edit Script" aus.
  7. Ein Fenster sollte aufgetaucht sein, vermutlich der Texteditor. Wenn das der Fall ist, hattest du ERFOLG!

    Nun, da du ein Skript erstellt hast, müssen wir noch etwas in die Datei einfügen. Eine Liste aller internen Befehle, Funktionen und Variablen findest du unter Abschnitt 5.

    Hier ein sehr einfaches Skript mit einem Hotkey, das, sobald man den Hotkey drückt, Text mithilfe des Send-Befehls sendet:

    ^j::
    Send, Mein erstes Skript
    return

    Wir werden später noch etwas genauer darauf eingehen. Bis dahin erkläre ich dir, was der obige Code macht:

  8. Speichere die Datei.
  9. Klicke zweimal mit der linken Maustaste auf die Datei bzw. auf das Symbol im Desktop, um das Skript zu starten. Öffne den Texteditor (oder wo auch immer du etwas schreiben kannst) und drücke Strg und J.
  10. Unglaublich! Dein erstes Skript ist fertig. Hol dir ein paar Snacks als Belohnung und lies dir den Rest des Tutorials durch.

Eine Videoanleitung findest du unter Install und Hello World auf YouTube.

c. Befehle kann man nicht zusammenführen

Beim Erstellen deines Codes hast du vielleicht schon den Drang verspürt, mehrere Befehle neben- oder sogar ineinander zu setzen - tue das nicht. In Abschnitt 5 werden wir darüber sprechen, warum das nicht wie erwartet funktioniert und was du stattdessen tun kannst.

d. Wie du die englische Hilfedatei auf deinem Computer finden kannst

Es gibt dafür mehrere Wege. Ich setze voraus, dass du das standardmäßige Installationsverzeichnis verwendet hast:

Methode 1:

  1. Suche das Startmenü oder Windows-Symbol auf deinem Bildschirm, üblicherweise unten links.
  2. Klicke auf Programme oder Alle Programme.
  3. Suche AutoHotkey in der Liste.
  4. Dort müsstest du AutoHotkey Help File sehen. Klicke darauf.
  5. Fertig!

Methode 2:

  1. Schaue auf deinem Desktop.
  2. Suche Arbeitsplatz oder Computer. Öffne es.
  3. Rufe deine Festplatte auf, die AutoHotkey enthält. Üblicherweise das Laufwerk C:\.
  4. Suche in allen "Program Files"-Ordnern nach AutoHotkey.
  5. Halte Ausschau nach AutoHotkey.chm oder einer Datei mit der Bezeichnung "AutoHotkey" und einem gelben Fragezeichen.
  6. Fertig!

2 - Hotkeys & Hotstrings

Was ist ein Hotkey? Ein Hotkey ist eine Taste, die sich heiß anfühlt. ... kleiner Scherz. Ein Hotkey ist eine Taste oder Tastenkombination, die der Benutzer auf der Tastatur drücken kann, um einige Aktionen auszulösen. Zum Beispiel:

^j::
Send, Mein erstes Skript
return

Was ist ein Hotstring? Hotstrings werden hauptsächlich verwendet, um Abkürzungen bei Eingabe zu erweitern (Auto-Ersetzen); sie können auch verwendet werden, um eine geskriptete Aktion zu starten. Zum Beispiel:

::ftw::Free the whales

Der Unterschied zwischen den beiden Beispielen besteht darin, dass der Hotkey durch Drücken von Strg+J ausgelöst werden kann, während der Hotstring dein geschriebenes "ftw" in "Free the whales" umwandelt.

"Also, wie genau erstellt eine Person wie ich einen Hotkey?" Gute Frage. Ein Hotkey wird mit einem einzelnen Doppelpunktpaar erstellt. Die Taste oder Tastenkombination kommt auf die linke Seite von ::. Der Inhalt muss darunter stehen, gefolgt von einem return.

Hinweis: Es gibt Ausnahmen, aber diese führen oft zu Problemen, als das sie nützlich sind. Deshalb wird im Tutorial nicht weiter darauf eingegangen, zumindest nicht im Moment.

Esc::
MsgBox, Escape!!!!
return

Ein Hotstring hat auf jeder Seite des Textes, der ersetzt werden soll, jeweils ein Doppelpunktpaar. Der Text, der deinen geschriebenen Text ersetzen soll, muss auf der rechten Seite des zweiten Doppelpunktpaares erfolgen.

Hotstrings können, wie bereits erwähnt, auch geskriptete Aktionen starten. Eine ausgefallene Bezeichnung für "tue so ziemlich alles". Das gleiche gilt für Hotkeys.

::bzw::
MsgBox, Sie haben bzw eingegeben.
return

Außerdem solltest du wissen, dass du jedem Hotkey, Hotstring, Label oder jedem anderen Element, über das wir noch nicht geredet haben, mehrere Codezeilen zuweisen kannst.

^j::
MsgBox, Wow!
MsgBox, Das sind
Run, notepad.exe
WinActivate, Unbenannt - Editor
WinWaitActive, Unbenannt - Editor
Send, 7 Zeilen{!}{Enter}
SendInput, innerhalb des STRG{+}J-Hotkeys.
return

a. Tasten und ihre mysteriösen Symbole

Du wunderst dich vielleicht: "Woher soll ich denn wissen, dass Zirkumflex (^) die Strg-Taste symbolisiert?!". Nun, gute Frage. Um dir beizubringen, was ^ und andere Symbole bedeuten, hilft dir die folgende Tabelle weiter:

Symbol Beschreibung
# Win (Windows-Logo-Taste)
! Alt
^ Strg
+ Umschalt
& Mit einem Und-Zeichen können zwei beliebige Tasten oder Maustasten zu einem benutzerdefinierten Hotkey kombiniert werden.

(Die vollständige Liste der Symbole findest du auf der Hotkey-Seite)

Zusätzlich findest du eine Liste aller/vieler Hotkey-Namen, die auf der linken Seite des Doppelpunktpaares eines Hotkeys verwendet werden können, unter Liste mit Tastatur-, Maus- und Joystick-Tasten.

Mithilfe von  &  kann eine benutzerdefinierte Kombination aus zwei (und nur zwei) Tasten (außer Joystick-Tasten) definiert werden. Das folgende Beispiel zeigt, wie einer der Hotkeys ausgelöst werden kann, wenn Numpad0 gedrückt gehalten und danach Numpad1 oder Numpad2 gedrückt wird:

Numpad0 & Numpad1::
MsgBox, Du hast Numpad1 gedrückt`, während du Numpad0 gedrückt hieltst.
return

Numpad0 & Numpad2::
Run, notepad.exe
return

Du fragst dich bestimmt jetzt, ob Hotstrings auch irgendwelche coole Modifikatoren haben. Ja, das haben sie! Hotstring-Modifikatoren gehören in das erste Doppelpunktpaar. Zum Beispiel:

:*:ftw::Free the whales

Weitere Hotkey- und Hotstring-Modifikatoren, Informationen und Beispiele findest du unter Hotkeys und Hotstrings.

b. Fenster-spezifische Hotkeys/Hotstrings

Du hast die Möglichkeit, ein Hotkey oder Hotstring nur für ein bestimmtes Fenster zu aktivieren (oder zu deaktivieren). Um das zu tun, musst du auf Befehle zurückgreifen, die ein #-Zeichen davor haben:

#IfWinActive
#IfWinExist

Diese speziellen Befehle (auch "Direktiven" genannt) erstellen kontextabhängige Hotkeys und Hotstrings. Gib einfach einen Fenstertitel an. In einigen Fällen kann es jedoch sinnvoll sein, Kriterien wie HWND, Gruppe oder Klasse anzugeben. Solche Kriterien erfordern fortgeschrittenes Wissen und werden auf der folgenden Seite ausführlicher behandelt: Fenstertitel-Parameter & Zuletzt Gefundenes Fenster.

#IfWinActive Unbenannt - Editor
#Space::
MsgBox, Du hast WIN+LEER im Texteditor gedrückt.
return

Um die Kontextabhängigkeit für nachfolgende Hotkeys oder Hotstrings auszuschalten, gibt man eine beliebige #IfWin-Direktive an und lässt ihre Parameter weg. Zum Beispiel:

; Unbenannt - Editor
#IfWinActive Unbenannt - Editor
!q::
MsgBox, Du hast ALT+Q im Texteditor gedrückt.
return

; Jedes andere Fenster, das nicht "Unbenannt - Editor" ist
#IfWinActive
!q::
MsgBox, Du hast ALT+Q in einem beliebigen Fenster gedrückt.
return

Wenn #IfWin-Direktiven nie in einem Skript verwendet werden, sind Hotkeys und Hotstrings für alle Fenster wirksam.

Die #IfWin-Direktiven sind von der Position abhängig: sie beeinflussen nur Hotkeys und Hotstrings, die sich im Skript physisch darunter befinden. Zudem schließen sie sich gegenseitig aus; das heißt, dass nur die aktuellste Direktive wirksam sein wird.

; Texteditor
#IfWinActive ahk_class Notepad
#Space::
MsgBox, Du hast WIN+LEER im Texteditor gedrückt.
return
::msg::Du hast msg im Texteditor geschrieben

; MSPaint
#IfWinActive Unbenannt - Paint
#Space::
MsgBox, Du hast WIN+LEER im Paint-Programm gedrückt!
return
::msg::Du hast msg im Paint-Programm geschrieben!

Weitere Informationen und ähnliche Befehle findest du auf der #IfWinActive-Seite.

c. Mehrere Hotkeys/Hotstrings pro Datei

Das kommt einigen Leuten aus irgendeinem Grund in den Sinn. Also werde ich es klarstellen: In AutoHotkey können so viele Hotkeys und Hotstrings wie möglich angegeben werden. Ob es nun 1, 3253 oder mehr sind - es spielt keine Rolle.

#i::
Run, http://www.google.com/
return

^p::
Run, notepad.exe
return

~j::
Send, ack
return

:*:acheiv::achiev
::achievment::achievement
::acquaintence::acquaintance
:*:adquir::acquir
::aquisition::acquisition
:*:agravat::aggravat
:*:allign::align
::ameria::America

Das Beispiel oben ist absolut in Ordnung. Mehrere Hotkeys, mehrere Hotstrings. Alle in einer großen glücklichen Skript-Datei.

d. Beispiele

::bzw::beziehungsweise  ; Ersetzt "bzw" mit "beziehungsweise", sobald du ein vordefiniertes Endungszeichen drückst.
:*:bzw::beziehungsweise  ; Ersetzt "bzw" mit "beziehungsweise", ohne dass ein Endungszeichen notwendig ist.
^n::  ; STRG+N-Hotkey
Run, notepad.exe  ; Startet den Windows-Texteditor, sobald du STRG+N drückst.
return  ; Dies endet den Hotkey. Der Code darunter wird nicht ausgelöst.
^b::  ; STRG+B-Hotkey
Send, {Ctrl down}c{Ctrl up}  ; Kopiert den markierten Text. ^c könnte man auch verwenden, allerdings ist diese Methode sicherer.
SendInput, [b]{Ctrl down}v{Ctrl up}[/b] ; Umschließt den markierten Text mit BBCode-Tags, um ihn in einem Forum fett darzustellen.
return  ; Dies endet den Hotkey. Der Code darunter wird nicht ausgelöst.

3 - Senden von Tastatureingaben

Du hast also vor, Tasten zu senden (virtuell zu drücken). Das können wir tun. Benutze den Send-Befehl. Dieser Befehl sendet wortwörtlich Tastatureingaben, um das Schreiben oder Drücken von Tasten zu simulieren.

Bevor wir uns dieser Sache zuwenden, sollten wir über die Probleme reden, auf die einige Leute häufig stoßen.

So wie Hotkeys auch, hat der Send-Befehl spezielle Tasten. Sehr, sehr viele davon. Hier die vier bekanntesten Symbole:

Symbol Beschreibung
! Sendet die Alt-Taste. Zum Beispiel würde Send, Das ist ein Text!a die Tasten "Das ist ein Text" senden und dann Alt+A drücken. Hinweis: !A hat in einigen Programmen einen anderen Effekt als !a. Das liegt daran, dass !A die Tastenkombination Alt+Umschalt+A und !a die Tastenkombination Alt+A drücken würde. Im Zweifelsfall sollte man immer Kleinbuchstaben verwenden.
+ Sendet die Umschalt-Taste. Zum Beispiel würde Send, +abC den Text "AbC" senden, und Send, !+a würde Alt+Umschalt+A drücken.
^ Sendet die Strg-Taste (Ctrl). Zum Beispiel würde Send ^!a die Tastenkombination Strg+Alt+A drücken, und Send ^{Home} würde Strg+Pos1 senden. Hinweis: ^A hat in einigen Programmen einen anderen Effekt als ^a. Das liegt daran, dass ^A die Tastenkombination Strg+Umschalt+A und ^a die Tastenkombination Strg+A drücken würde. Im Zweifelsfall sollte man immer Kleinbuchstaben verwenden.
# Sendet die Win-Taste (die Taste mit dem Windows-Logo), demzufolge würde Send #e die Win-Taste gedrückt halten und dann den Buchstaben "e" drücken.

Die gigantische Tabelle auf der Send-Seite zeigt so ziemlich jede spezielle Taste, die in AHK integriert ist. Zum Beispiel: {Enter} und {Space}.

Vorsicht: Diese Tabelle gilt nicht für Hotkeys. Das heißt, dass du beim Erstellen eines Hotkeys Tasten wie Strg oder Enter nicht mit geschweiften Klammern umschließen sollst.

Das folgende Beispiel zeigt, was man mit einem Hotkey nicht machen sollte:

; Beim Erstellen eines Hotkeys...
; FALSCH
{LCtrl}::
Send, AutoHotkey
return

; RICHTIG
LCtrl::
Send, AutoHotkey
return

Ein häufiges Problem, das viele Leute haben, ist, dass sie davon ausgehen, dass die geschweiften Klammern nur zum Spaß gesetzt werden. Aber in Wirklichkeit werden sie gebraucht. Nur so kann AHK wissen, dass z. B. {!} als "Ausrufezeichen" und nicht als "drücke die Alt-Taste" interpretiert werden soll. Vergiss nicht, dass du mit der Tabelle auf der Send-Seite überprüfen kannst, ob alle Klammern richtig gesetzt sind. Zum Beispiel:

Send, Dieser Text wurde geschrieben{!} ; Hast du bemerkt, dass das ! in geschweiften Klammern gesetzt ist? Wäre dies nicht so, würde AHK die ALT-Taste drücken.
; Das gleiche wie oben, aber mit der ENTER-Taste. AHK würde "Enter" ausschreiben, wenn
; es nicht von geschweiften Klammern umschlossen wäre.
Send, Mehrere Enter Zeilen wurden Enter gesendet. ; FALSCH
Send, Mehrere{Enter}Zeilen wurden{Enter}gesendet. ; RICHTIG

Ein weiteres Problem, das viele Leute haben, ist, dass sie glauben, dass jedes einzelne Zeichen beim Send-Befehl in geschweiften Klammern gesetzt werden muss. Das ist FALSCH. Wenn es nicht in der Tabelle steht, braucht es keine Klammern. Normale Buchstaben, Zahlen oder sogar einige Symbole wie . müssen nicht in geschweiften Klammern gesetzt werden. Außerdem kannst du pro Send-Befehl mehr als einen Buchstaben, eine Zahl oder ein Symbol senden. Send-Befehle mit je einem Buchstaben sind unnötig. Zum Beispiel:

Send, {a}       ; FALSCH
Send, {b}       ; FALSCH
Send, {c}       ; FALSCH
Send, {a}{b}{c} ; FALSCH
Send, {abc}     ; FALSCH
Send, abc       ; RICHTIG

Um eine Taste gedrückt zu halten oder loszulassen, umschließt man den Tastennamen mit geschweiften Klammern und fügt das Wort UP oder DOWN ein. Zum Beispiel:

; So hältst du eine Taste gedrückt, während du eine weitere Taste (oder Tasten) drückst.
; Sollte eine Methode nicht funktionieren, kannst du eine andere ausprobieren.
Send, ^s                     ; Beide Zeilen senden STRG+S
Send, {Ctrl down}s{Ctrl up}  ; Beide Zeilen senden STRG+S
Send, {Ctrl down}c{Ctrl up}
Send, {b down}{b up}
Send, {Tab down}{Tab up}
Send, {Up down}  ; Drückt die NACH-OBEN-Taste nach unten.
Sleep, 1000      ; Hält sie eine Sekunde lang gedrückt.
Send, {Up up}    ; Lässt die NACH-OBEN-Taste los.

Aber nun wunderst du dich vielleicht "Wie kann ich meine wirklich langen Send-Befehle besser lesbar machen?". Einfach. Greife auf den sogenannten Fortsetzungsbereich zurück. Beginne einfach eine neue Zeile mit einer runden Startklammer, schreibe auf der nächsten Zeile deinen Inhalt, und schließe den Bereich mit einer runden Endklammer. Weitere Informationen findest du unter Fortsetzungsbereiche.

Send,
(
Zeile 1
Zeile 2
Äpfel sind Früchte.
)

Hinweis: Es gibt verschiedene Methoden zum Senden von Text. Jede Methode hat ihre eigenen Besonderheiten. Wenn eine Methode nicht wie gewollt funktioniert, kannst du eine andere ausprobieren. Ersetze den Befehlsnamen "Send" einfach mit dem Namen einer anderen Methode: SendRaw, SendInput, SendPlay, SendEvent. Um mehr über die verschiedenen Methoden zu erfahren, siehe hier.

a. Spiele

Das ist wichtig: Viele Spiele, vor allem die modernen, verfügen über eine Software, um Cheats zu verhindern. Namentlich wären das zum Beispiel GameGuard, Hackshield oder PunkBuster. Das Umgehen solcher Systeme ist nicht nur kompliziert, sondern verstößt auch gegen die Spielregeln, was zu einem dauerhaften Bann führen kann.

Wenn ein Spiel über so ein System verfügt und deine Hotkeys, Hotstrings und Send-Befehle nicht funktionieren, hast du Pech gehabt. Allerdings gibt es Methoden, um die Erfolgschance bei einigen Spielen zu erhöhen, aber erwarte nicht, dass sie auf wundersame Weise sofort funktionieren werden. Ich empfehle dir, JEDE Methode auszuprobieren, bevor du aufgibst.

Es ist allgemein bekannt, dass DirectX die Ursache vieler Probleme ist. Wenn du bei einem DirectX-Spiel auf Probleme stößt, kannst du die auf der FAQ-Seite beschriebenen Lösungsansätze ausprobieren. Weitere DirectX-Probleme können auftreten, wenn man PixelSearch, PixelGetColor oder ImageSearch verwendet. Farben werden als schwarz (0x000000) erkannt, egal welche Farbe du versuchst abzurufen. Du solltest auch versuchen, das Spiel im Fenstermodus zu starten, wenn möglich. Damit könnten einige DirectX-Probleme beseitigt werden.

Es gibt keine einheitliche Lösung, um AutoHotkey für alle Programme lauffähig zu machen. Wenn jeder Versuch deinerseits fehlschlägt, ist AutoHotkey eventuell nicht für deine Anforderungen geeignet.

4 - Starten von Programmen & Webseiten

Um ein Programm wie mspaint.exe, calc.exe, script.ahk oder sogar einen Ordner zu starten, nutzt man den Run-Befehl. Run kann sogar genutzt werden, um URLs wie https://autohotkey.com/ zu öffnen. Das folgende Beispiel zeigt, wie auf einfache Weise ein Programm gestartet werden kann, sofern dein Computer dahingehend eingerichtet wurde:
; Starte ein Programm. Beachte, dass die meisten Programme einen VOLLSTÄNDIGEN Dateipfad benötigen:
Run, %A_ProgramFiles%\Beliebiges_Programm\Programm.exe

; Öffne eine Webseite:
Run, https://autohotkey.com

Run unterstützt noch andere Features, wie z. B. Befehlszeilenparameter und CLSID. Wenn du mehr darüber erfahren möchtest, solltest du einen Blick auf die Run-Seite werfen.

Hier ein paar weitere Beispiele:

; Einige Programme wie die von Windows benötigen keinen vollständigen Pfad:
Run, notepad.exe
Run, mspaint.exe

; Öffne den Ordner "Eigene Dokumente" mithilfe der internen AHK-Variable:
Run, %A_MyDocuments%

; Öffne einige Webseiten:
Run, https://autohotkey.com
Run, http://www.google.com

Weiterführende Informationen und Beispiele findest du auf der Run-Seite.

5 - Befehle vs. Funktionen()

AutoHotkey stellt zwei grundlegende Werkzeuge bereit, die man zum Erstellen eines Skripts verwenden kann: Befehle und Funktionen.

Eine Liste aller Befehle und internen Funktionen kannst du hier finden.

Befehle

Einen Befehl kannst du anhand seiner Syntax (Schreibweise) erkennen. Befehle verwenden keine runden Klammern, um die Parameter vom Rest abzugrenzen, wie es bei Funktionen der Fall ist. Ein Befehl würde also wie folgt aussehen:

Befehl, Parameter1, Parameter2, Parameter3

Es ist nicht möglich, mehrere Befehle nebeneinander zu setzen (Ausnahme: IfEqual). Es ist nicht möglich, einen Befehl in den Parametern eines anderen Befehls zu setzen. Zum Beispiel:

MsgBox, Hallo Run, notepad.exe   ; Falsch
MsgBox, Hallo, Run, notepad.exe  ; Falsch

MsgBox, Hallo      ; Richtig
Run, notepad.exe
Befehle unterscheiden sich von einer Funktion auch dadurch, dass sie die "altmodische Syntax" verwenden. Das heißt, dass eine Variable von Prozentzeichen umschlossen sein muss, wie z. B. %Var%, und dass Texte und Zahlen nicht in Anführungszeichen gesetzt werden müssen, wie z. B. Das ist ein Text. Außerdem können im Gegensatz zu den Parametern einer Funktion keine Berechnungen in den Parametern eines Befehls durchgeführt werden.

Du kannst mit einem einzelnen % einen Ausdruck und somit Berechnungen in einem Parameter erzwingen, aber darauf wird hier nicht weiter eingegangen.

Funktionen

Wie bereits erwähnt nutzen Funktionen im Gegensatz zu Befehlen runde Klammern. Eine typische Funktion sieht wie folgt aus:

Funktion(Parameter1, Parameter2, Parameter3)

Funktionen unterscheiden sich durch folgende Punkte:

  1. Du kannst Berechnungen in ihnen durchführen:
    SubStr(37 * 12, 1, 2)
    SubStr(A_Hour - 12, 2)
  2. Variablen müssen nicht von Prozentzeichen umschlossen sein:
    SubStr(A_Now, 7, 2)
  3. Funktionen können in anderen Funktionen eingefügt werden:
    SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
  4. Texte müssen in Anführungszeichen gesetzt werden:
    SubStr("Ich programmiere, genial!", 16)

Funktionen geben in der Regel einen Wert anders als Befehle zurück. Befehle benötigen einen AusgabeVar-Parameter, Funktionen nicht. Die gebräuchlichste Methode, einer Variable den Rückgabewert der Funktion zuzuweisen, sieht so aus:

MeineVar := SubStr("Ich programmiere, genial!", 16)

Das ist nicht der einzige, aber der meist verwendete Weg. Du nutzt MeineVar, um den Rückgabewert der Funktion, die auf der rechten Seite des :=-Operators zu sehen ist, zu speichern. Einzelheiten findest du unter Funktionen.

Kurz gesagt:

; Das sind Befehle:
MsgBox, Dies ist etwas Text.
StringReplace, Ausgabe, Eingabe, AutoHotkey, AutoHotKey, All
SendInput, Das ist genial{!}{!}{!}

; Das sind Funktionen:
SubStr("Ich programmiere, genial!", 16)
FileExist(VariableMitPfad)
Ausgabe := SubStr("Ich programmiere, genial!", 16)

a. Code-Blöcke

Codeblöcke sind Codezeilen, die von kleinen geschweiften Klammern ({ und }) umschlossen sind. Sie gruppieren einen Abschnitt des Codes, um AutoHotkey mitzuteilen, dass sie eine große Familie sind, die zusammenbleiben müssen. Sie werden häufig bei Funktionen und Ablaufsteuerungsanweisungen wie If und Loop eingesetzt. Lässt man die Klammern weg, wird nur die erste Zeile des Blocks aufgerufen.

Im folgenden Code werden die beiden Zeilen nur ausgeführt, wenn MeineVar gleich 5 ist:

if (MeineVar = 5)
{
    MsgBox, MeineVar ist gleich %MeineVar%!!
    ExitApp
}

Im folgenden Code wird das Mitteilungsfenster nur angezeigt, wenn MeineVar gleich 5 ist. Das Skript wird immer beendet, selbst wenn MeineVar nicht 5 ist:

if (MeineVar = 5)
    MsgBox, MeineVar ist gleich %MeineVar%!!
    ExitApp

Diese Vorgehensweise ist völlig in Ordnung, da der if-Anweisung nur eine Codezeile zugeordnet ist. Es ist genau das gleiche wie oben, allerdings habe ich die zweite Zeile nicht eingerückt, um zu zeigen, dass sie nicht der if-Anweisung gehört:

if (MeineVar = 5)
    MsgBox, MeineVar ist gleich %MeineVar%!!
MsgBox, Wir sind nun 'außerhalb' der if-Anweisung. Wir brauchten keine geschweiften Klammern, da sich nur eine Zeile darunter befand.

6 - Variablen

Variablen sind quasi kleine Klebezettel, die wichtige Informationen enthalten. Sie können verwendet werden, um Text, Zahlen, Daten von Funktionen/Befehlen oder mathematischen Gleichungen zu speichern. Ohne sie wäre das Programmieren bzw. Skripten sehr viel anstrengender.

Es gibt mehrere Wege, wie man einer Variable etwas zuweisen kann. Allerdings befassen wir uns nur mit den bekanntesten Formen. Bitte achte auf das Gleichheitszeichen (=).

Altmodische Zuweisung eines Textes
MeineVar = Text

Das ist die einfachste Form, einer Variable etwas zuzuweisen - die sogenannte altmodische Zuweisung. Gib einfach deinen Text ein und fertig.

Altmodische Zuweisung einer Variable
MeineVar = %MeineVar2%

Das gleiche wie oben, außer dass du einer Variable den Wert einer anderen Variable zuweist.

Altmodische gemischte Zuweisung
MeineVar = %MeineVar2% etwas Text %MeineVar3%.

Eine Kombination von den zwei altmodischen Zuweisungen oben.

Ausdruckszuweisung eines Textes
MeineVar := "Text"

Das ist wegen : vor = eine Ausdruckszuweisung. Texte müssen in "Anführungszeichen" gesetzt werden.

Ausdruckszuweisung einer Variable
MeineVar := MeineVar2

Im Ausdrucksmodus dürfen Variablen nicht von Prozentzeichen umschlossen sein.

Ausdruckszuweisung einer Zahl
MeineVar := 6 + 8 / 3 * 2 - Sqrt(9)

Dank des Ausdrucks kannst du Berechnungen durchführen!

Ausdruckszuweisung, gemischt
MeineVar := "Das Ergebnis von 5 + " MeineVar2 " ist: " 5 + MeineVar2

Eine Kombination von den drei Audruckszuweisungen oben.

Gleichheitszeichen (=) mit vorangestelltem Symbol wie z. B. := += -= .= etc. werden Zuweisungsoperator genannt und benötigen immer einen Ausdruck.

a. Wann und wo Prozentzeichen verwendet werden

Viele haben Probleme damit zu erkennen, wann und wo Variablen mit Prozentzeichen (%) umschlossen werden müssen. Hoffentlich wird dir folgende Übersicht weiterhelfen.

Wann und wo Prozentzeichen verwendet werden:

Wann und wo Prozentzeichen nicht verwendet werden:

b. Abrufen von Benutzereingaben

Manchmal ist es notwendig, Informationen eines Benutzers einzufordern. Es gibt mehrere Möglichkeiten, dies zu tun, aber der einfachste Weg ist die InputBox. Hier ein einfaches Beispiel, wie man dem Benutzer ein paar Fragen stellen kann und die eingegebenen Dinge verarbeitet:

InputBox, AusgabeVar, Frage 1, Wie lautet dein Vorname?
if (AusgabeVar = "Bill")
    MsgBox, Du hast einen tollen Namen`, %AusgabeVar%.

InputBox, AusgabeVar2, Frage 2, Magst du AutoHotkey?
if (AusgabeVar2 = "ja")
    MsgBox, Danke`, dass du mit %AusgabeVar2% geantwortet hast`, %AusgabeVar%! Wir werden gute Freunde.
else
    MsgBox, %AusgabeVar%`, das macht mich traurig.

c. Weitere Beispiele

MsgBox, 4,, Möchtest du fortfahren?
IfMsgBox, No
    return  ; Bei Nein wird der Code genau hier gestoppt.
MsgBox, Du hast JA gedrückt.  ; Ansonsten hat der Benutzer Ja ausgewählt.
; Einige Beispiele, die zeigen, wo Prozentzeichen notwendig sind und wo nicht:
Var = Text  ; Weist einer Variable etwas Text zu (altmodisch).
Zahl := 6  ; Weist einer Variable eine Zahl zu (Ausdruck).
Var2 = %Var%  ; Weist einer Variable eine andere zu (altmodisch).
Var3 := Var  ; Weist einer Variable eine andere zu (Ausdruck).
Var4 .= Var  ; Fügt eine Variable an das Ende einer anderen an (Ausdruck).
Var5 += Zahl  ; Addiert den Wert einer Variable mit einer anderen (Ausdruck).
Var5 -= Zahl  ; Subtrahiert den Wert einer Variable von einer anderen (Ausdruck).
Var6 := SubStr(Var, 2, 2)  ; Variable innerhalb einer Funktion. Dies ist immer ein Ausdruck.
Var7 = %Var% Text  ; Weist einer Variable eine andere plus etwas Text zu (altmodisch).
Var8 := Var " Text"  ; Weist einer Variable eine andere plus etwas Text zu (Ausdruck).
MsgBox, %Var%  ; Variable innerhalb eines Befehls. 
StringSplit, Var, Var, x  ; Variable innerhalb eines Befehls, der EingabeVar und AusgabeVar verwendet.
if (Zahl = 6)  ; Ein IF mit runden Klammern ist immer ein Ausdruck. Daher keine Prozentzeichen.
if (Var != Zahl)  ; Ein IF mit runden Klammern ist immer ein Ausdruck. Daher keine Prozentzeichen.
if Zahl = 6  ; Ohne runde Klammern ist das IF altmodisch. Allerdings benötigen nur die Variablen auf der 'rechten Seite' Prozentzeichen. 
if Var1 < %Var2%  ; Ohne runde Klammern ist das IF altmodisch. Allerdings benötigen nur die Variablen auf der 'rechten Seite' Prozentzeichen.

7 - Objekte

Objekte sind eine Möglichkeit, deine Daten auf eine effizientere Weise zu organisieren. Manchmal werden Objekte auch als Arrays bezeichnet. Beachte aber, dass alle Arrays eigentlich nur Objekte sind. Wir geben den Objekten je nach Verwendungszweck unterschiedliche Namen, aber in der Regel sind alle Objekte gleich.

Ein Objekt ist im Grunde genommen eine Sammlung von Variablen. Die Variablennamen werden als "Keys" bezeichnet und der Inhalt der Variablen ist "Values".

Wenn du Leute hörst, die ein Objekt als Array oder indiziertes Array bezeichnen, bedeutet das in der Regel, dass alle Keys fortlaufende Nummern sind, beginnend bei 1. Wenn du Leute hörst, die ein Objekt als assoziatives Array bezeichnen, bedeutet das, dass die Keys entweder Zeichenketten (Text) oder nicht-fortlaufende Nummern sind. Manchmal ist es auch eine Mischung aus beidem, einschließlich fortlaufender Nummern!

Es gibt keine Einschränkungen, was ein Key oder Value sein kann - sie können sogar andere Arrays sein! Ein Array, das Arrays enthält, wird als Mehrdimensionales Array bezeichnet, aber dazu später mehr.

Es gibt eine Reihe von Gründen, warum ein Objekt nützlich sein kann. Einige Beispiele:

a. Erstellen von Objekten

Es gibt viele Wege, um ein Objekt zu erstellen, allerdings werden nachfolgend nur die gängigsten aufgelistet:

Syntax mit eckigen Klammern
MeinObjekt := ["eins", "zwei", "drei", 17]

Auch bekannt als "indiziertes Array". Ein indiziertes Array ist ein Objekt, das eine Liste von Elementen mit der Nummerierung 1 und höher repräsentiert. In diesem Beispiel wird der Wert "eins" in den Objekt-Key 1 (alias Index 1) und der Wert 17 in den Objekt-Key 4 (alias Index 4) gespeichert.

Syntax mit geschweiften Klammern
Banane := {"Farbe": "Gelb", "Geschmack": "Köstlich", "Preis": 3}

Auch bekannt als "assoziatives Array". Ein assoziatives Array ist eine Sammlung von Daten, wo jedes Element einen Namen hat. In diesem Beispiel wird der Wert "Gelb" in den Objekt-Key "Farbe" gespeichert. Außerdem wird der Wert 3 in den Objekt-Key "Preis" gespeichert.

Array-Funktion
MeinObjekt := Array("eins", "zwei", "drei", 17)

Identisch zur Syntax mit eckigen Klammern, aber in einer Funktion verpackt.

Object-Funktion
Banane := Object("Farbe", "Gelb", "Geschmack", "Köstlich", "Preis", 3)

Identisch zur Syntax mit geschweiften Klammern, aber in einer Funktion verpackt.

Vergiss nicht, dass all diese Definitionen das gleiche erstellen (Objekte), nur mit unterschiedlichen Keys.

b. Verwenden von Objekten

Objekte können vielfältig eingesetzt werden. Sie können Werte abrufen, Werte setzen, neue Werte hinzufügen und so weiter.

Setzen von Werten:

Klammerschreibweise
Banane["Verfault"] := True ; Diese Banane ist verfault. Bäh.

Das Setzen von Werten in einem Objekt ist so einfach wie das Setzen des Wertes einer Variable. Du musst lediglich die Klammerschreibweise auf die linke Seite eines Ausdruckszuweisungssymbols := setzen.

Punktschreibweise
Banane.Konsistenz := "Matschig"

Das gleiche wie oben, aber mit der Punktschreibweise.

Abrufen von Werten:

Klammerschreibweise
Wert := Banane["Farbe"]

Mit dieser Schreibweise ist es möglich, ein Ausdruck als Key zu verwenden, um an den Wert deines Objekts zu kommen. In diesem Fall habe ich den einfachen Ausdruck "Farbe" verwendet, das (wenig überraschend) der Key Farbe ist. Dir wird ein Mitteilungsfenster mit dem Wort "Gelb" angezeigt, weil wir im vorherigen Abschnitt den Key Farbe auf "Gelb" gesetzt hatten.

Punktschreibweise
Wert := Banane.Farbe

Diese Schreibweise lässt dich nur direkt geschriebene Zeichenketten als Keys verwenden. In den Keys können keine Variablen angegeben werden.

Hinzufügen neuer Keys und Werte:

Klammerschreibweise
MeinObjekt["NeuerKey"] := 3.1415

Um einen Wert oder Key direkt hinzuzufügen, legt man einfach einen Key an, der noch nicht existiert.

Punktschreibweise
MeinObjekt.NeuerKey := "Glänzend"

Das gleiche wie oben, aber mit der Punktschreibweise.

InsertAt-Methode
MeinObjekt.InsertAt(Index, Wert1, Wert2, Wert3...)

Index ist ein beliebiger Integer-Key. Diese Methode wird ALLE höheren Integer-Keys um die Anzahl der eingefügten Werte nach oben verschieben, selbst wenn Lücken vorhanden sind (fügst du beispielsweise zwischen den Keys 1 und 100 einen Wert in Key 50 ein, wird der Key 100 auf 101 verschoben).

Push-Methode
MeinObjekt.Push(Wert1, Wert2, Wert3...)

Diese Methode bewirkt, dass die Werte an das Ende des Arrays MeinObjekt "angefügt" werden. Das heißt, dass die Werte bei dem höchsten Integer-Key plus eins eingefügt werden.

Entfernen von Keys und Werten:

Wert leer machen
Banane.Konsistenz := ""

Der einfachste Weg, einen Wert zu entfernen, besteht darin, ihn leer zu machen. Setze den Wert einfach auf "", auch bekannt als leere Zeichenkette. Der Key wird dadurch nicht entfernt, aber es wird die Illusion erzeugt, als wäre sein Wert noch nicht gesetzt. Anhand der HasKey-Methode kann man erkennen, dass der Key noch vorhanden ist. Außerdem taucht der Key weiterhin in einer For-Schleife auf.

Delete-Methode
EntfernterWert := MeinObjekt.Delete(BeliebigerKey)

Diese und die nächsten Methoden darunter entfernen den Key und den Wert. Der vorherige Wert von MeinObjekt[BeliebigerKey] wird in EntfernterWert gespeichert.

AnzahlEntfernterKeys := MeinObjekt.Delete(ErsterKey, LetzterKey)

Mit dieser Methode kann ein Bereich von Integer- (nummerierten) oder Zeichenketten-Keys zwischen ErsterKey und LetzterKey entfernt werden. Der zurückgegebene Wert ist die Anzahl der Keys, die entfernt wurden - dieser Wert ist nützlich, wenn du eine Lücke zwischen deinen Keys hast (wenn du z. B. die Keys 1, 3 und 4 angegeben hast, wird AnzahlEntfernterKeys eine 3 sein, weil nur 3 Keys entfernt werden konnten).

Pop-Methode
MeinObjekt.Pop()

Entfernt den höchsten Integer-Key, und gibt den Wert zurück. Höhere Keys als diesen gibt es nicht.

RemoveAt-Methode
EntfernterWert := MeinObjekt.RemoveAt(Index)
AnzahlEntfernterKeys := MeinObjekt.RemoveAt(Index, Länge)

Diese Methode entfernt alle Keys von Index bis Index + Länge - 1. Wenn Länge fehlt, gilt standardmäßig 1. Nach dem Entfernen der Keys werden alle höheren Integer-Keys (nummerierten) nach unten verschoben, um die Lücke zu füllen, so dass der Wert bei Index + Länge, sofern vorhanden, nun bei Index sein wird. Dieser Sachverhalt entspricht der Funktionsweise der InsertAt-Methode mit mehreren angegebenen Werten.

8 - Andere hilfreiche Goodies

Wir haben das Ende unserer Reise erreicht, werter Freund. Ich hoffe, du hast etwas gelernt. Aber bevor wir gehen, zeige ich dir noch ein paar Dinge, die du wissen solltest. Viel Spaß!

a. Die mysteriösen eckigen Klammern

Auf vielen Seiten wirst du zwei Symbole ([ und ]) innerhalb einer gelben Syntax-Box sehen, die etwas Bestimmtes umschließen. Alles, was sich innerhalb dieser eckigen Klammern befindet, ist OPTIONAL. Das bedeutet, dass du das Zeug darin weglassen kannst, wenn du es nicht benötigst. Beim Schreiben deines Codes ist es sehr wichtig, die eckigen Klammern NICHT in deinem Code zu verwenden.

Auf der ControlGetText-Seite wirst du folgendes sehen:

ControlGetText, AusgabeVar , Steuerelement, Fenstertitel, Fenstertext, Titelausnahme, Textausnahme

Also könntest du folgendes tun:

ControlGetText, AusgabeVar

Oder weitere Details einfügen:

ControlGetText, AusgabeVar, Steuerelement, Fenstertitel

Was ist zu tun, wenn du Titelausnahme, aber nicht Fenstertext oder Fenstertitel angeben willst? Einfach!

ControlGetText, AusgabeVar, Steuerelement,,, Titelausnahme

Bitte beachte, dass die Parameter nicht IGNORIERT, sondern nur leer gelassen werden können. Wenn du Fenstertitel, Fenstertext ignorieren würdest, würde es wie folgt aussehen und zu Problemen führen:

ControlGetText, AusgabeVar, Steuerelement, Titelausnahme

b. Herausfinden deiner AHK-Version

Führe den folgenden Code aus, um deine aktuelle AHK-Version anzeigen zu lassen:

MsgBox, %A_AhkVersion%

Oder suche im Startmenü oder Installationsverzeichnis nach "AutoHotkey Help File" oder "AutoHotkey.chm".

c. Trial-and-Error-Prinzip

Trial-and-Error (Versuch und Irrtum) ist eine sehr verbreitete und effektive Möglichkeit des Lernens. Statt bei jeder Kleinigkeit nachzufragen, kann es manchmal hilfreich sein, wenn man etwas Zeit für sich alleine verbringt (manchmal Stunden oder Tage) und versucht, etwas selbst auf die Reihe zu bekommen.

Wenn du etwas ausprobierst und eine Fehlermeldung erhältst, solltest du diesen Fehler analysieren. Versuche dann, deinen Code zu korrigieren. Führe ihn nochmals aus. Wenn du weiterhin einen Fehler erhältst, sollte er auch korrigiert werden. Setze dieses Verfahren fort, bis dein Code funktioniert. Auf diese Weise lernst du viel, weil du die Dokumentation liest, Fehler analysierst und kennenlernst, was funktioniert und was nicht. Versuchen, scheitern, versuchen, scheitern, versuchen, versuchen, versuchen, scheitern, scheitern, erfolgreich sein!

So haben viele "Profis" begonnen. Aber habe keine Angst zu fragen, wir beißen nicht. Das Lernen ist ein langwieriger Prozess; Die "Profis" haben AutoHotkey auch nicht in einem Tag gemeistert.

"Wenn es beim ersten Mal nicht klappt, versuchen, versuchen Sie es erneut." - William E. Hickson

d. Einrückung

Diese Sache (Einrücken) ist sehr wichtig! Dein Code läuft auch ohne Einrücken einwandfrei, aber es hilft dir und anderen, dein Code zu lesen. Ein kleines Skript (25 Zeilen oder weniger) ohne eingerücktem Code kann vermutlich ohne Probleme gelesen werden, aber je größer es wird, desto unübersichtlicher wird es. Am besten lernst du so schnell wie möglich, wie du deinen Code einrücken kannst. Auf welche Weise du dein Code einrückst, spielt keine Rolle, aber achte darauf, dass es gleichmäßig aussieht.

"Was ist Einrückung?", fragst du dich? Man entflechtet den Code einfach mit Leerräumen, um sehen zu können, was zu was gehört. Normalerweise werden 3 oder 4 Leerzeichen oder ein Tabulatorzeichen pro "Stufe" verwendet.

Nicht eingerückt:

if (Auto = "alt")
{
MsgBox, Das Auto ist wirklich alt.
if (Räder = "platt")
{
MsgBox, Das Auto ist nicht zum Fahren geeignet.
return
}
else
{
MsgBox, Sei vorsichtig! Dieses alte Auto könnte zu einer Gefahr werden.
}
}
else
{
MsgBox, Meine Güte`, was für ein glänzendes neues Fahrzeug du hast.
}

Eingerückt:

if (Auto = "alt")
{
    MsgBox, Das Auto ist wirklich alt.
    if (Räder = "platt")
    {
        MsgBox, Das Auto ist nicht zum Fahren geeignet.
        return
    }
    else
    {
        MsgBox, Sei vorsichtig! Dieses alte Auto könnte zu einer Gefahr werden.
    }
}
else
{
    MsgBox, Meine Güte`, was für ein glänzendes neues Fahrzeug du hast.
}

Schau dir den Wikipedia-Artikel Einrückungsstil an, um verschiedene Stile und Beispiele in Erfahrung zu bringen. Entscheide selbst, was oder wie du einrücken willst bzw. wie dein Code am einfachsten gelesen werden kann.

e. Um Hilfe bitten

Zuallererst solltest du selbst versuchen, Nachforschungen zu betreiben oder den Code zu schreiben. Wenn du mit den Ergebnissen nicht zufrieden bist, kannst du die Community fragen, aber beachte dabei folgende Punkte:

Erwarte nicht, dass du sofort eine Antwort bekommst - warte wenigstens 1 Tag (24 Stunden), bevor du nachhakst. Wir helfen gerne, aber bedenke, dass wir unsere Hilfe kostenlos anbieten und unsere Freizeit dafür opfern. Wir könnten gerade arbeiten, schlafen, spielen, mit der Familie zusammen sein, oder einfach zu beschäftigt sein, um zu helfen.

Während du auf Hilfe wartest, könntest du selbst versuchen, das Problem zu lösen. Es ist ein tolles Gefühl, etwas ohne Hilfe geschafft zu haben.

f. Andere Links

Häufig gestellte Fragen (FAQ)