AutoHotkey Anfänger-Tutorial von tidbit

Inhaltsverzeichnis

  1. Die Grundlagen
    1. AutoHotkey herunterladen und installieren
    2. Wie man ein Skript erstellt
    3. Befehle kann man nicht zusammenführen
    4. Wie man die englische Hilfedatei auf dem Computer findet
  2. Hotkeys & Hotstrings
    1. Tasten und ihre mysteriösen Symbole
    2. Fensterspezifische Hotkeys/Hotstrings
    3. Mehrere Hotkeys/Hotstrings pro Datei
    4. Beispiele
  3. Tastendrücke senden
    1. Videospiele
  4. Programme & Webseiten starten
  5. Befehle vs. Funktionen()
    1. Codeblöcke
  6. Variablen
    1. Wann und wo Prozentzeichen verwendet werden
    2. Benutzereingaben abrufen
    3. Weitere Beispiele
  7. Objekte
    1. Objekte erstellen
    2. Objekte verwenden
  8. Andere hilfreiche Goodies
    1. Die mysteriösen eckigen Klammern
    2. Die AHK-Version herausfinden
    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 deinen 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) benutzt, musst du es herunterladen. Danach musst du AHK eventuell installieren, abhängig von der Version, die 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://www.autohotkey.com/
  2. Klicke auf Download: https://www.autohotkey.com/download/ahk-install.exe
  3. Während der Installation von AutoHotkey wirst du aufgefordert, zwischen UNICODE und ANSI zu wählen. Kurzum, Sie sollten sich für UNICODE entscheiden. Es unterstützt nicht-englische Buchstaben und Zahlen (Zeichen). Fahre fort, bis du eine Schaltfläche zur Installation von AutoHotkey siehst.
  4. Wenn das erledigt ist, super! Weiter mit Abschnitt b.

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

b. Wie man ein Skript erstellt

Die folgende Anleitung zeigt dir, wie du AutoHotkey dazu bringst, etwas zu tun. AutoHotkey ist keine Zauberei - wir alle wünschen uns, dass es so wäre, aber es ist nicht so. Wir müssen AutoHotkey also sagen, was zu tun ist. Dieser Vorgang wird "Scripting" genannt.

Anleitung:

  1. Rechtsklicke auf deinen Desktop.
  2. Suche den Menüpunkt "Neu".
  3. Klicke auf "AutoHotkey Script" im Menü "Neu".
  4. Gib dem Skript einen neuen Namen. Der Name muss auf .ahk enden. Zum Beispiel: MeinSkript.ahk
  5. Suche die neue Datei auf deinem Desktop und rechtsklicke darauf.
  6. Klicke auf "Edit Script".
  7. Es sollte sich ein Fenster öffnen, wahrscheinlich Notepad. Wenn dies der Fall ist, 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. Wenn der Hotkey gedrückt wird, wird Text mithilfe des Send-Befehls gesendet:

    ^j::
    Send, Mein erstes Skript
    return

    Später werden wir uns noch etwas genauer damit beschäftigen. Bis dahin erkläre ich dir, was der obige Code macht:

  8. Speichere die Datei.
  9. Doppelklicke auf die Datei bzw. auf das Symbol im Desktop, um das Skript auszuführen. Öffne Notepad (oder wo auch immer du etwas schreiben kannst) und drücke Strg und J.
  10. Unglaublich! Dein erstes Skript ist fertig. Hol dir zur Belohnung ein paar Snacks und lies dir den Rest des Tutorials durch.

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

c. Befehle kann man nicht zusammenführen

Beim Schreiben deines Codes wirst du vielleicht den Drang verspürt haben, mehrere Befehle nebeneinander oder sogar ineinander zu setzen - tu das nicht. In Abschnitt 5 werden wir besprechen, warum das nicht wie erwartet funktioniert und was du stattdessen tun kannst.

d. Wie man die englische Hilfedatei auf dem Computer findet

Es gibt mehrere Möglichkeiten. Ich gehe davon aus, dass du das Standardinstallationsverzeichnis verwendet hast:

Methode 1:

  1. Suche die Startschaltfläche auf deinem Bildschirm und klicke darauf, üblicherweise unten links.
  2. Klicke auf Alle Apps (ehemals Alle Programme), falls nötig.
  3. Suche AutoHotkey in der Liste.
  4. Dort solltest du AutoHotkey Help File sehen. Klicke darauf.
  5. Fertig!

Methode 2:

  1. Öffne den Explorer, z.B. durch Rechtsklick auf die Startschaltfläche.
  2. Suche Dieser PC (ehemals Arbeitsplatz oder Computer) im linken Fensterbereich. Klicke darauf.
  3. Navigiere zum Laufwerk, auf dem sich AutoHotkey befindet. In der Regel ist das Laufwerk C:\.
  4. Suche in allen Programme-Ordnern nach AutoHotkey.
  5. Halte Ausschau nach AutoHotkey.chm oder einer Datei mit dem Namen "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 bestimmte Aktionen auszulösen. Zum Beispiel:

^j::
Send, Mein erstes Skript
return

Was ist ein Hotstring? Hotstrings werden hauptsächlich verwendet, um geschriebene Abkürzungen in lange Texte umzuwandeln (kurz Auto-Ersetzen), aber auch, 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 wird, während der Hotstring dein geschriebenes "ftw" in "Free the whales" umwandelt.

"Also, wie genau erstellt jemand wie ich einen Hotkey?" Gute Frage. Ein Hotkey wird mit einem einzelnen Doppelpunktpaar erstellt. Die Taste oder Tastenkombination wird links von :: geschrieben. Der Inhalt muss darunter stehen, gefolgt von einem return.

Hinweis: Es gibt Ausnahmen, aber diese sind eher verwirrend als nützlich. Daher werden sie im Tutorial nicht weiter behandelt, zumindest nicht im Moment.

Esc::
MsgBox, Escape!!!!
return

Ein Hotstring hat auf jeder Seite des zu ersetzenden Textes ein Doppelpunktpaar. Der Text, der deinen geschriebenen Text ersetzen soll, muss auf der rechten Seite des zweiten Doppelpunktpaares stehen.

Hotstrings können, wie bereits erwähnt, auch geskriptete Aktionen starten. Das ist eine ausgefallene Bezeichnung für "tu so ziemlich alles". Dasselbe gilt für Hotkeys.

::bzw::
MsgBox, Du hast bzw geschrieben.
return

Außerdem solltest du wissen, dass du jedem Hotkey, Hotstring, Label und jedem anderen Element, das wir noch nicht besprochen haben, mehr als eine Codezeile 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 fragst dich vielleicht: "Woher soll ich wissen, dass das 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)

Eine Liste aller Hotkey-Namen, die auf der linken Seite des Doppelpunktpaares eines Hotkeys verwendet werden können, findest du unter Tastenliste (Tastatur, Maus und Controller).

Mit & kann eine benutzerdefinierte Kombination von zwei (und nur zwei) Tasten (außer Controllertasten) definiert werden. Das folgende Beispiel zeigt, wie einer der Hotkeys ausgelöst werden kann, wenn Numpad0 gedrückt gehalten und dann 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 jetzt sicher, ob Hotstrings auch coole Modifikatoren haben. Ja, die 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. Fensterspezifische Hotkeys/Hotstrings

Du hast die Möglichkeit, einen Hotkey oder Hotstring nur für ein bestimmtes Fenster zu aktivieren (oder zu deaktivieren). Dazu musst du Befehle verwenden, denen ein #-Zeichen vorangestellt ist:

#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 fortgeschrittene Kenntnisse und werden auf der folgenden Seite ausführlicher behandelt: FensterTitel-Parameter & Zuletzt Gefundenes Fenster.

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

Um die Kontextabhängigkeit für nachfolgende Hotkeys oder Hotstrings auszuschalten, gib eine beliebige #IfWin-Direktive ohne Parameter an. Zum Beispiel:

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

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

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

Die #IfWin-Direktiven sind positionsabhängig, d.h. sie beeinflussen nur Hotkeys und Hotstrings, die sich im Skript physisch darunter befinden. Außerdem schließen sie sich gegenseitig aus, d.h. nur die aktuellste Direktive ist wirksam.

; Notepad
#IfWinActive ahk_class Notepad
#Space::
MsgBox, Du hast WIN+LEER in Notepad gedrückt.
return
::msg::Du hast msg in Notepad 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

Aus irgendeinem Grund haben einige Leute Probleme damit. Also werde ich es klarstellen: AutoHotkey bietet dir die Möglichkeit, beliebig viele Hotkeys und Hotstrings in einer Datei zu definieren. Ob es nun 1, 3253 oder mehr sind, spielt keine Rolle.

#i::
Run, https://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 obige Beispiel ist völlig in Ordnung. Mehrere Hotkeys, mehrere Hotstrings. Alles in einer großen, glücklichen Skriptdatei.

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 Notepad, sobald du STRG+N drückst.
return  ; Dies ist das Ende des Hotkeys. Der Code darunter wird beim Drücken des Hotkeys nicht ausgeführt.
^b::  ; STRG+B-Hotkey
Send, {Ctrl down}c{Ctrl up}  ; Kopiert den markierten Text. Man könnte auch ^c verwenden, aber diese Methode ist 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 ist das Ende des Hotkeys. Der Code darunter wird beim Drücken des Hotkeys nicht ausgeführt.

3 - Tastendrücke senden

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 Tastendrücke, um das Schreiben oder Drücken von Tasten zu simulieren.

Doch bevor wir uns damit befassen, sollten wir über einige häufig auftretende Probleme sprechen.

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

Symbol Beschreibung
! Sendet Alt. Zum Beispiel würde Send, Dies ist ein Text!a die Tasten "Dies ist ein Text" senden und dann Alt+A drücken. Hinweis: !A hat in manchen Programmen eine andere Wirkung als !a. Der Grund dafür ist, dass !A die Tastenkombination Alt+Umschalt+A und !a die Tastenkombination Alt+A drückt. Im Zweifelsfall immer Kleinbuchstaben verwenden.
+ Sendet Umschalt. Zum Beispiel bewirkt Send, +abC, dass der Text "AbC" gesendet wird, und Send, !+a, dass Alt+Umschalt+A gedrückt wird.
^ Sendet Strg. Zum Beispiel bewirkt Send ^!a, dass Strg+Alt+A gedrückt wird, und Send ^{Home}, dass Strg+Pos1 gesendet wird. Hinweis: ^A hat in manchen Programmen eine andere Wirkung als ^a. Der Grund dafür ist, dass ^A die Tastenkombination Strg+Umschalt+A und ^a die Tastenkombination Strg+A drückt. Im Zweifelsfall immer Kleinbuchstaben verwenden.
# Sendet Win (die Taste mit dem Windows-Logo), also würde Send #e Win gedrückt halten und dann E drücken.

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

Achtung: Diese Tabelle gilt nicht für Hotkeys. Das heißt, dass du Tasten wie Strg oder Enter nicht mit geschweiften Klammern umschließen solltest, wenn du einen Hotkey erstellst.

Das folgende Beispiel zeigt, was mit einem Hotkey nicht gemacht werden 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 denken, dass geschweifte Klammern nur zum Spaß gesetzt werden. Aber tatsächlich sind sie notwendig. Nur so weiß AHK, dass z.B. {!} "Ausrufezeichen" bedeutet, nicht "drücke Alt". Vergiss nicht, dass du die Tabelle auf der Send-Seite verwenden kannst, um zu prüfen, ob alle Klammern richtig gesetzt sind. Zum Beispiel:

Send, Dieser Text wurde geschrieben{!} ; Ist dir aufgefallen, dass das ! in geschweiften Klammern steht? Wäre dies nicht der Fall, würde AHK die ALT-Taste drücken.
; Wie oben, aber mit der ENTER-Taste. AHK würde "Enter" ausschreiben, wenn
; es nicht in geschweiften Klammern gesetzt 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 geschweifte Klammern gesetzt werden muss. Das ist FALSCH. Wenn es nicht in der Tabelle steht, braucht es keine Klammern. Normale Buchstaben, Zahlen und sogar einige Symbole wie . müssen nicht in geschweifte Klammern gesetzt werden. Außerdem kannst du mehr als einen Buchstaben, eine Zahl oder ein Symbol pro Send-Befehl verwenden. Send-Befehle, die nur einen Buchstaben senden, 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, setze den Tastennamen in geschweifte Klammern und füge das Wort UP oder DOWN hinzu. 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, probiere eine andere aus.
Send, ^s                     ; Beide senden STRG+S
Send, {Ctrl down}s{Ctrl up}  ; Beide senden STRG+S
Send, {Ctrl down}c{Ctrl up}
Send, {b down}{b up}
Send, {Tab down}{Tab up}
Send, {Up down}  ; Die NACH-OBEN-Taste nach unten drücken.
Sleep, 1000      ; 1 Sekunde gedrückt halten.
Send, {Up up}    ; Die NACH-OBEN-Taste loslassen.

Jetzt fragst du dich vielleicht: "Wie kann ich meine wirklich langen Send-Befehle besser lesbar machen?". Ganz einfach. Verwende den sogenannten Fortsetzungsbereich. Schreibe einfach eine runde Startklammer auf eine neue Zeile, dann deinen Inhalt und anschließend eine runde Endklammer. Weitere Informationen findest du unter Fortsetzungsbereiche.

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

Hinweis: Es gibt verschiedene Varianten von Send. Jede hat ihre eigenen Besonderheiten. Wenn eine nicht wie gewünscht funktioniert, probiere eine andere aus. Ersetze einfach den Befehlsnamen "Send" mit einem der folgenden: SendRaw, SendInput, SendPlay, SendEvent. Weitere Informationen zu den einzelnen Varianten findest du hier.

a. Videospiele

Das ist wichtig: Einige Spiele, insbesondere Multiplayer-Spiele, verwenden Anti-Cheat-Programme. Zum Beispiel GameGuard, Hackshield oder PunkBuster. Das Umgehen solcher Systeme ist nicht nur kompliziert, sondern verstößt auch gegen die Videospielregeln, was zu einem dauerhaften Bann führen kann.

Wenn ein Videospiel ein solches System hat und deine Hotkeys, Hotstrings und Send-Befehle nicht funktionieren, hast du Pech gehabt. Es gibt jedoch Methoden, um die Erfolgschancen bei einigen Videospielen 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 Probleme mit einem DirectX-Videospiel hast, probiere die auf der FAQ-Seite beschriebenen Lösungsansätze aus. Weitere DirectX-Probleme können bei der Verwendung von PixelSearch, PixelGetColor oder ImageSearch auftreten. Farben werden als schwarz (0x000000) erkannt, egal welche Farbe du versuchst abzurufen. Du solltest auch versuchen, das Videospiel im Fenstermodus zu starten, wenn möglich. Dies könnte einige DirectX-Probleme lösen.

Es gibt keine einheitliche Lösung, um AutoHotkey für alle Programme funktionsfähig zu machen. Wenn alle Versuche fehlschlagen, ist AutoHotkey möglicherweise nicht für deine Zwecke geeignet.

4 - Programme & Webseiten starten

Um ein Programm wie mspaint.exe, calc.exe oder script.ahk zu starten oder einen Ordner zu öffnen, verwende den Run-Befehl. Run kann sogar zum Öffnen von URLs wie https://www.autohotkey.com/ verwendet werden. Wenn dein Computer so eingerichtet ist, dass er das gewünschte Programm ausführen kann, ist das ganz einfach:

; Ein Programm starten. Beachte, dass die meisten Programme einen VOLLSTÄNDIGEN Dateipfad benötigen:
Run, %A_ProgramFiles%\Beliebiges_Programm\Programm.exe

; Eine Webseite öffnen:
Run, https://www.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

; Den Ordner "Dokumente" mit einer internen AHK-Variable öffnen:
Run, %A_MyDocuments%

; Einige Webseiten öffnen:
Run, https://www.autohotkey.com
Run, https://www.google.com

Weitere Informationen und Beispiele findest du auf der Run-Seite.

5 - Befehle vs. Funktionen()

AutoHotkey stellt zwei grundlegende Dinge zur Verfügung, um ein Skript zu erstellen: Befehle und Funktionen.

Eine Liste aller Befehle und internen Funktionen findest du hier.

Befehle

Einen Befehl erkennt man an seiner Syntax (Schreibweise). Befehle verwenden keine runden Klammern, um die Parameter vom Rest zu trennen, 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). Außerdem ist es nicht möglich, einen Befehl in die Parameter 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 Funktionen auch dadurch, dass sie die "Legacy-Syntax" verwenden. Das heißt, dass du alle Variablen mit Prozentzeichen umschließen musst, wie z.B. %Var%, und dass Texte und Zahlen nicht in Anführungszeichen gesetzt werden müssen, wie z.B. Das ist ein Text. Im Gegensatz zu den Parametern einer Funktion können in den Parametern eines Befehls keine Berechnungen durchgeführt werden.

Mit einem % kann ein Ausdruck erzwungen und somit Berechnungen in den Parametern durchgeführt werden, aber das wird hier nicht weiter behandelt.

Funktionen

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

Funktion(Parameter1, Parameter2, Parameter3)

Funktionen unterscheiden sich in folgenden Punkten:

  1. Du kannst in ihnen Berechnungen durchführen:
    SubStr(37 * 12, 1, 2)
    SubStr(A_Hour - 12, 2)
  2. Variablen müssen nicht mit Prozentzeichen umschlossen werden:
    SubStr(A_Now, 7, 2)
  3. Funktionen können in andere 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)

Eine Funktion gibt ihren Wert in der Regel anders zurück als ein Befehl. Befehle benötigen einen AusgabeVar-Parameter, Funktionen nicht. Der übliche Weg, den Rückgabewert einer Funktion einer Variable zuzuweisen, sieht wie folgt aus:

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

Das ist nicht der einzige Weg, aber der am häufigsten verwendete. Man verwendet MeineVar auf der rechten Seite des :=-Operators, um den Rückgabewert der Funktion zu speichern. Weitere Informationen findest du unter Funktionen.

Kurz gesagt:

; Das sind Befehle:
MsgBox, Dies ist ein 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. Codeblöcke

Codeblöcke sind Codezeilen, die von kleinen geschweiften Klammern ({ und }) umschlossen sind. Dadurch weiß AutoHotkey, dass es sich um eine große Familie handelt und die Zeilen zusammen ausgeführt werden sollen. Codeblöcke werden häufig bei Funktionen und Kontrollanweisungen wie If und Loop verwendet. Ohne die Klammern wird nur die erste Zeile des Blocks ausgeführt.

Im folgenden Code werden beide 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, auch dann, wenn MeineVar nicht 5 ist:

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

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

if (MeineVar = 5)
    MsgBox, MeineVar ist gleich %MeineVar%!!
MsgBox, Wir sind nun 'außerhalb' der if-Anweisung. Geschweifte Klammern waren nicht nötig, da nur eine Zeile darunter war.

6 - Variablen

Variablen sind vergleichbar mit Klebezetteln, die Informationen enthalten. Sie können verwendet werden, um Text, Zahlen, Daten von Funktionen/Befehlen oder mathematische Gleichungen zu speichern. Ohne Variablen wäre das Programmieren und Skripten sehr viel mühsamer.

Es gibt mehrere Wege, einer Variable etwas zuzuweisen. Wir werden uns aber nur mit den bekanntesten beschäftigen. Bitte achte auf das Gleichheitszeichen (=).

Legacy-Textzuweisung
MeineVar = Text

Dies ist der einfachste Weg, einer Variable etwas zuzuweisen - eine Legacy-Zuweisung. Einfach den Text hinschreiben und fertig.

Legacy-Variablenzuweisung
MeineVar = %MeineVar2%

Wie oben, nur dass einer Variable der Wert einer anderen Variable zugewiesen wird.

Legacy-Mischzuweisung
MeineVar = %MeineVar2% etwas Text %MeineVar3%.

Eine Kombination der beiden Legacy-Zuweisungen oben.

Ausdruckstextzuweisung
MeineVar := "Text"

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

Ausdrucksvariablenzuweisung
MeineVar := MeineVar2

Im Ausdrucksmodus benötigen Variablen keine Prozentzeichen.

Ausdruckszahlenzuweisung
MeineVar := 6 + 8 / 3 * 2 - Sqrt(9)

Dank der Ausdrücke kannst du auch rechnen!

Ausdrucksmischzuweisung
MeineVar := "Das Ergebnis von 5 + " MeineVar2 " ist: " 5 + MeineVar2

Eine Kombination der drei obigen Ausdruckszuweisungen.

Gleichheitszeichen (=) mit vorangestelltem Symbol wie z.B. :=, +=, -= und .= nennen sich Zuweisungsoperatoren und benötigen immer einen Ausdruck.

a. Wann und wo Prozentzeichen verwendet werden

Viele haben Schwierigkeiten zu erkennen, wann und wo Variablen mit Prozentzeichen (%) umschlossen werden. Hoffentlich hilft die folgende Übersicht.

Wann und wo Prozentzeichen verwendet werden:

Wann und wo Prozentzeichen nicht verwendet werden:

b. Benutzereingaben abrufen

Manchmal ist es notwendig, Informationen vom Benutzer abzufragen. Es gibt mehrere Wege, dies zu tun, aber der einfachste ist die InputBox. Hier ein einfaches Beispiel, das zeigt, wie man dem Benutzer einige Fragen stellt und die gesammelten Daten 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,, Willst du weitermachen?
IfMsgBox, No
    return  ; Wenn Nein, stoppt der Code genau hier.
MsgBox, Du hast JA gedrückt.  ; Andernfalls hat der Benutzer Ja ausgewählt.
; Einige Beispiele, die zeigen, wo Prozentzeichen notwendig sind und wo nicht:
Var = Text  ; Einer Variable etwas Text zuweisen (Legacy).
Zahl := 6  ; Einer Variable eine Zahl zuweisen (Ausdruck).
Var2 = %Var%  ; Einer Variable eine andere zuweisen (Legacy).
Var3 := Var  ; Einer Variable eine andere zuweisen (Ausdruck).
Var4 .= Var  ; Eine Variable ans Ende einer anderen anfügen (Ausdruck).
Var5 += Zahl  ; Den Wert einer Variable mit einem anderen addieren (Ausdruck).
Var5 -= Zahl  ; Den Wert einer Variable von einem anderen subtrahieren (Ausdruck).
Var6 := SubStr(Var, 2, 2)  ; Variable in einer Funktion. Dies ist immer ein Ausdruck.
Var7 = %Var% Text  ; Einer Variable eine andere plus etwas Text zuweisen (Legacy).
Var8 := Var " Text"  ; Einer Variable eine andere plus etwas Text zuweisen (Ausdruck).
MsgBox, %Var%  ; Variable in einem Befehl. 
StringSplit, Var, Var, x  ; Variable in einem Befehl mit EingabeVar und AusgabeVar.
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 im Legacy-Modus. Nur Variablen auf der 'rechten Seite' benötigen Prozentzeichen. 
if Var1 < %Var2%  ; Ohne runde Klammern ist das IF im Legacy-Modus. Nur Variablen auf der 'rechten Seite' benötigen Prozentzeichen.

7 - Objekte

Objekte sind eine Möglichkeit, deine Daten effizienter zu organisieren. Manchmal werden Objekte auch Arrays genannt. 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 eine Sammlung von Variablen. Die Variablennamen heißen "Schlüssel" und der Inhalt der Variablen "Werte".

Wenn jemand ein Objekt als Array oder indiziertes Array bezeichnet, bedeutet das normalerweise, dass alle Schlüssel fortlaufende Nummern sind, beginnend mit 1. Wenn jemand ein Objekt als assoziatives Array bezeichnet, bedeutet das, dass die Schlüssel 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 Schlüssel oder Wert sein kann - sie können sogar andere Arrays sein! Ein Array, das Arrays enthält, nennt sich Mehrdimensionales Array, aber dazu später mehr.

Es gibt zahlreiche Gründe, warum man ein Objekt für etwas verwenden möchte. Einige Beispiele:

a. Objekte erstellen

Es gibt viele Wege, ein Objekt zu erstellen. Hier die gängigsten:

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

Auch als "indiziertes Array" bekannt. Ein indiziertes Array ist ein Objekt, das eine Liste von Elementen repräsentiert, die mit 1 und höher nummeriert sind. In diesem Beispiel wird der Wert "eins" in den Objektschlüssel 1 (alias Index 1) und der Wert 17 in den Objektschlüssel 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, bei der jedes Element einen Namen hat. In diesem Beispiel wird der Wert "Gelb" in den Objektschlüssel "Farbe" gespeichert. Zusätzlich wird der Wert 3 in den Objektschlüssel "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 dasselbe erstellen (Objekte), nur mit unterschiedlichen Schlüsseln.

b. Objekte verwenden

Objekte können auf verschiedene Weise verwendet werden. Sie können Werte abrufen, Werte setzen, neue Werte hinzufügen usw.

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 der linken Seite eines Ausdruckszuweisungssymbols := verwenden.

Punktschreibweise
Banane.Konsistenz := "Matschig"

Dasselbe wie oben, aber mit Punktschreibweise.

Abrufen von Werten

Klammerschreibweise
Wert := Banane["Farbe"]

Damit kannst du einen Ausdruck als Schlüssel verwenden, um an den Wert deines Objekts zu kommen. In diesem Fall habe ich den einfachen Ausdruck "Farbe" verwendet, was (wenig überraschend) der Schlüssel Farbe ist. Du wirst ein Mitteilungsfenster mit dem Wort "Gelb" sehen, da wir im vorherigen Abschnitt den Schlüssel Farbe auf "Gelb" gesetzt haben.

Punktschreibweise
Wert := Banane.Farbe

Dies erlaubt nur direkt geschriebene Zeichenketten als Schlüssel. In diesem Fall können keine Variablen in den Schlüsseln verwendet werden.

Hinzufügen neuer Schlüssel und Werte

Klammerschreibweise
MeinObjekt["NeuerSchlüssel"] := 3.1415

Um einen Wert oder Schlüssel direkt hinzuzufügen, setze einfach einen Schlüssel, der noch nicht existiert.

Punktschreibweise
MeinObjekt.NeuerSchlüssel := "Glänzend"

Dasselbe wie oben, aber mit Punktschreibweise.

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

Index ist ein beliebiger Integerschlüssel. Dies verschiebt alle höheren Integerschlüssel um die Anzahl der eingefügten Werte nach oben, selbst wenn Lücken vorhanden sind (wenn z.B. nur die Schlüssel 1 und 100 existieren und du einen Wert bei Schlüssel 50 einfügst, wird 100 auf 101 verschoben).

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

Dies bewirkt, dass die Werte an das Ende des Arrays MeinObjekt "angefügt" werden. Das heißt, dass die Werte beim höchsten Integerschlüssel plus eins eingefügt werden.

Entfernen von Schlüsseln und Werten

Leermachen eines Wertes
Banane.Konsistenz := ""

Der einfachste Weg, einen Wert zu entfernen, ist, ihn leer zu machen. Setze ihn einfach auf "", auch bekannt als leere Zeichenkette. Dadurch wird der Schlüssel nicht entfernt, aber die Illusion erzeugt, als wäre der Wert ein ungesetzter Wert. Mit der HasKey-Methode kann man prüfen, ob der Schlüssel noch existiert. Außerdem erscheint der Schlüssel weiterhin in einer For-Schleife.

Delete-Methode
EntfernterWert := MeinObjekt.Delete(BeliebigerSchlüssel)

Diese und die nächsten Methoden entfernen den Schlüssel und den Wert. Der vorherige Wert von MeinObjekt[BeliebigerSchlüssel] wird in EntfernterWert gespeichert.

AnzahlEntfernterSchlüssel := MeinObjekt.Delete(ErsterSchlüssel, LetzterSchlüssel)

Dies entfernt einen Bereich von Integer- (nummerierten) oder Zeichenkettenschlüsseln zwischen ErsterSchlüssel und LetzterSchlüssel. Der Rückgabewert ist die Anzahl der entfernten Schlüssel - dieser Wert ist nützlich, wenn du eine Lücke zwischen deinen Schlüsseln hast (wenn z.B. die Schlüssel 1, 3 und 4 angegeben sind, wird AnzahlEntfernterSchlüssel auf 3 gesetzt, da nur 3 Schlüssel entfernt werden konnten).

Pop-Methode
MeinObjekt.Pop()

Entfernt den höchsten Integerschlüssel und gibt seinen Wert zurück. Es gibt keine höheren Schlüssel als diesen.

RemoveAt-Methode
EntfernterWert := MeinObjekt.RemoveAt(Index)
AnzahlEntfernterSchlüssel := MeinObjekt.RemoveAt(Index, Länge)

Dies entfernt alle Schlüssel von Index bis Index + Länge - 1. Wenn Länge weggelassen wird, wird standardmäßig 1 verwendet. Nach dem Entfernen der Schlüssel werden alle höheren Integer- bzw. nummerierten Schlüssel nach unten verschoben, um die Lücke zu füllen, so dass der Wert bei Index + Länge, falls vorhanden, nun bei Index ist. Dies ähnelt der Funktionsweise der InsertAt-Methode mit mehreren angegebenen Werten.

8 - Andere hilfreiche Goodies

Wir sind am Ende unserer Reise angelangt, werter Freund. Ich hoffe, du hast etwas gelernt. Aber bevor wir gehen, zeige ich dir noch ein paar Dinge, die du wissen solltest. Hab Spaß!

a. Die mysteriösen eckigen Klammern

Auf vielen Seiten wirst du zwei Symbole ([ und ]) innerhalb einer gelben Syntaxbox sehen, die etwas Bestimmtes umschließen. Alles innerhalb dieser eckigen Klammern ist optional. Das bedeutet, dass du alles dort drinnen weglassen kannst, wenn du es nicht brauchst. 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, AusnahmeTitel, AusnahmeText

Du könntest also folgendes machen:

ControlGetText, AusgabeVar

Oder mehr Details hinzufügen:

ControlGetText, AusgabeVar, Steuerelement, FensterTitel

Was ist, wenn du AusnahmeTitel verwenden möchtest, aber nicht FensterText oder FensterTitel? Ganz einfach!

ControlGetText, AusgabeVar, Steuerelement,,, AusnahmeTitel

Beachte, dass du die Parameter nicht IGNORIEREN kannst, aber du kannst sie leer lassen. Würde man FensterTitel, FensterText ignorieren, sähe das wie folgt aus und würde zu Problemen führen:

ControlGetText, AusgabeVar, Steuerelement, AusnahmeTitel

b. Die AHK-Version herausfinden

Führe den folgenden Code aus, um deine aktuelle AHK-Version anzuzeigen:

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 weit verbreitete und effektive Art des Lernens. Anstatt wegen jeder Kleinigkeit nachzufragen, kann es manchmal hilfreich sein, sich etwas Zeit zu nehmen (manchmal Stunden oder Tage) und die Lösung selbst zu finden. So lernst du schneller.

Wenn du etwas ausprobierst und eine Fehlermeldung erhältst, analysiere den Fehler. Versuche dann, deinen Code zu korrigieren. Führe ihn erneut aus. Wenn du immer noch eine Fehlermeldung erhältst, passe deinen Code weiter an. Fahre auf diese Weise fort, bis dein Code funktioniert. Auf diese Weise wirst du viel lernen, indem du die Dokumentation liest, die Fehler analysierst und herausfindest, was funktioniert und was nicht. Versuchen, scheitern, versuchen, scheitern, versuchen, versuchen, versuchen, scheitern, scheitern, Erfolg!

So haben viele "Profis" angefangen. Aber zögere nicht, uns um Hilfe zu bitten, wir beißen nicht. Lernen ist ein langwieriger Prozess, auch die "Profis" haben AutoHotkey nicht an 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ückung, aber es hilft dir und anderen, deinen Code zu lesen. Ein kleines Skript (25 Zeilen oder weniger) ohne eingerückten 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ückst. Es spielt keine Rolle, wie du deinen Code einrückst, aber achte darauf, dass es gleichmäßig aussieht.

"Was ist Einrücken?", fragst du dich? Es geht einfach darum, den Code mithilfe von Leerräumen in überschaubare Bestandteile zu gliedern, 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, Dieses Auto ist nicht fahrtüchtig.
return
}
else
{
MsgBox, Sei vorsichtig! Dieses alte Auto könnte zu einer Gefahr werden.
}
}
else
{
MsgBox, Meine Güte`, dein neues Auto glänzt ja richtig.
}

Eingerückt:

if (Auto = "alt")
{
    MsgBox, Das Auto ist wirklich alt.
    if (Räder = "platt")
    {
        MsgBox, Dieses Auto ist nicht fahrtüchtig.
        return
    }
    else
    {
        MsgBox, Sei vorsichtig! Dieses alte Auto könnte zu einer Gefahr werden.
    }
}
else
{
    MsgBox, Meine Güte`, dein neues Auto glänzt ja richtig.
}

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 zu lesen ist.

e. Um Hilfe bitten

Zuerst solltest du versuchen, selbst zu recherchieren 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 sofort geantwortet wird - warte wenigstens 1 Tag (24 Stunden), bevor du nachfragst. Wir helfen gerne, aber bedenke, dass wir unsere Hilfe kostenlos anbieten und unsere Freizeit dafür opfern. Wir könnten gerade arbeiten, schlafen, spielen, Zeit mit der Familie verbringen, oder einfach zu beschäftigt sein, um zu helfen.

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

f. Andere Links

Häufig gestellte Fragen (FAQ)