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.
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:
Eine Videoanleitung findest du unter Install and Hello World auf YouTube.
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:
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:
^j::
ist der Hotkey. ^
symbolisiert Strg, j
ist die Taste J. Alles links von ::
sind die Tasten, die du drücken musst.Send, Mein erstes Skript
ist der Vorgang zum Senden von Tastendrücken. Send
ist der Befehl, alles nach dem Komma (,) wird gesendet.return
. Dies wird dein bester Freund. Es hält den Code buchstäblich davon ab, die Zeilen darunter anzusteuern. Das kann eine Menge Probleme vermeiden, besonders wenn du damit anfängst, viele Dinge in dein Skript einzufügen.Eine Videoanleitung findest du unter Install and Hello World auf YouTube.
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.
Es gibt mehrere Möglichkeiten. Ich gehe davon aus, dass du das Standardinstallationsverzeichnis verwendet hast:
Methode 1:
Methode 2:
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
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.
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.
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.
::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.
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.
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.
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.
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.
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.
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:
SubStr(37 * 12, 1, 2) SubStr(A_Hour - 12, 2)
SubStr(A_Now, 7, 2)
SubStr(A_AhkPath, InStr(A_AhkPath, "AutoHotkey"))
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)
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.
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 (=
).
MeineVar = Text
Dies ist der einfachste Weg, einer Variable etwas zuzuweisen - eine Legacy-Zuweisung. Einfach den Text hinschreiben und fertig.
MeineVar = %MeineVar2%
Wie oben, nur dass einer Variable der Wert einer anderen Variable zugewiesen wird.
MeineVar = %MeineVar2% etwas Text %MeineVar3%.
Eine Kombination der beiden Legacy-Zuweisungen oben.
MeineVar := "Text"
Dies ist eine Ausdruckszuweisung wegen :
vor =
. Texte müssen in Anführungszeichen gesetzt werden.
MeineVar := MeineVar2
Im Ausdrucksmodus benötigen Variablen keine Prozentzeichen.
MeineVar := 6 + 8 / 3 * 2 - Sqrt(9)
Dank der Ausdrücke kannst du auch rechnen!
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.
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:
StringLen, OutputVar, InputVar
Var = 123abc
if Var1 < %Var2%
if (Var1 != Var2) Var1 := Var2 + 100
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.
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.
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:
Es gibt viele Wege, ein Objekt zu erstellen. Hier die gängigsten:
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.
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.
MeinObjekt := Array("eins", "zwei", "drei", 17)
Identisch zur Syntax mit eckigen Klammern, aber in einer Funktion verpackt.
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.
Objekte können auf verschiedene Weise verwendet werden. Sie können Werte abrufen, Werte setzen, neue Werte hinzufügen usw.
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.
Banane.Konsistenz := "Matschig"
Dasselbe wie oben, aber mit Punktschreibweise.
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.
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.
MeinObjekt["NeuerSchlüssel"] := 3.1415
Um einen Wert oder Schlüssel direkt hinzuzufügen, setze einfach einen Schlüssel, der noch nicht existiert.
MeinObjekt.NeuerSchlüssel := "Glänzend"
Dasselbe wie oben, aber mit Punktschreibweise.
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).
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.
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.
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).
MeinObjekt.Pop()
Entfernt den höchsten Integerschlüssel und gibt seinen Wert zurück. Es gibt keine höheren Schlüssel als diesen.
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.
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ß!
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
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".
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
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.
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.