Häufig gestellte Fragen (FAQ)

Inhaltsverzeichnis

Allgemeine Problembehandlung

Allgemeine Aufgaben

Hotkeys, Hotstrings und Neubelegung

Allgemeine Problembehandlung

Was kann ich tun, wenn AutoHotkey nicht installiert wird?

Wenn AutoHotkey nicht auf normalem Wege installiert werden kann, finden Sie weitere Hilfe unter Wie man AutoHotkey installiert.

Wie stelle ich die Kontextmenüoptionen für .ahk-Dateien wieder her?

Normalerweise sollte, wenn AutoHotkey installiert ist, ein Rechtsklick auf eine AutoHotkey-Skriptdatei (.ahk) die folgenden Optionen bieten:

Hinweis: In Windows 11 befinden sich einige dieser Optionen in einem Untermenü, das über "Weitere Optionen anzeigen" aufgerufen werden kann.

Manchmal werden diese Optionen durch Einstellungen im Profil des aktuellen Benutzers überschrieben, z.B. wenn Öffnen mit verwendet wurde, um das Standardprogramm zum Öffnen von .ahk-Dateien zu ändern. Dieses Problem kann durch Löschen des folgenden Registry-Schlüssels behoben werden:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ahk\UserChoice

Sie können hierfür einen Registry-Patch verwenden oder UX\reset-assoc.ahk im AutoHotkey-Installationsverzeichnis ausführen.

Eventuell müssen Sie auch die Standardwerte in der Registry reparieren, indem Sie entweder AutoHotkey neu installieren oder UX\install.ahk im AutoHotkey-Installationsverzeichnis ausführen.

Warum funktioniert mein Skript in Windows xxx nicht, obwohl es in einer vorherigen Version lief?

Dieses Problem gibt es in mehreren Varianten:

Wenn Sie auf ein anderes Betriebssystem umgestiegen sind, kann es sein, dass sich etwas geändert hat, das sich auf Ihr Skript auswirkt. Haben Sie zum Beispiel einen neuen Computer, können andere Treiber oder Software installiert sein. Wenn Sie AutoHotkey auf eine neue Version aktualisiert haben, finden Sie heraus, welche Version zuvor installiert war, und überprüfen Sie dann das Changelog und die Kompatibilitätshinweise auf Änderungen, die Ihr Skript beeinträchtigen könnten.

Siehe auch die folgende Frage:

Wie umgehe ich Probleme, die von der Benutzerkontensteuerung (UAC) erzeugt werden?

Aus Sicherheitsgründen verhindert die Benutzerkontensteuerung (engl. User Account Control, kurz UAC), dass "höherberechtigte" Programme (also Programme mit Adminrechten) von anderen, nicht-höherberechtigten Programmen automatisiert werden können. Auch Hotkeys werden blockiert, so dass bspw. ein nicht-höherberechtigtes Programm keine Eingaben mitlesen kann, die für ein höherberechtigtes Programm bestimmt sind.

UAC kann sich auch negativ auf SendPlay und BlockInput auswirken.

Es gibt folgende Übergangslösungen:

Ich kann mein Skript nicht über das Tray-Symbol editieren, weil es sich aufgrund eines Fehlers nicht starten lässt. Was muss ich tun?

Sie müssen den Fehler in Ihrem Skript beheben, wenn Sie das Tray-Symbol zurückhaben wollen. Dazu ist es erforderlich, das Skript zu finden und in einem Texteditor zu öffnen, aber nicht über das Tray-Symbol, sondern auf andere Weise.

Wenn Sie eine AutoHotkey-EXE-Datei direkt ausführen, wird automatisch ein Skript mit demselben Namen gestartet. Führen Sie beispielsweise AutoHotkey32.exe aus, müssen Sie nach AutoHotkey32.ahk im selben Verzeichnis suchen. Beachten Sie, dass je nach Systemeinstellung die .ahk-Endung versteckt sein könnte, allerdings sollte die Datei ein Symbol haben, das wie folgt aussieht: [H]

Normalerweise können Sie eine Skriptdatei editieren, indem Sie darauf rechtsklicken und Edit Script auswählen. Wenn das nicht funktioniert, öffnen Sie die Datei in Notepad oder in einem anderen Texteditor.

In der Regel sollten Sie eine Skriptdatei erstellen (irgendetwas.ahk), egal wo, und diese Skriptdatei ausführen, anstatt AutoHotkey zu starten.

Siehe auch Befehlszeilenparameter "Skriptdateiname" und Portabilität von AutoHotkey.exe.

Wie kann ich Fehler in meinem Code finden und beheben?

Für einfache Skripte siehe Ein Skript debuggen. Um den Inhalt einer Variable anzuzeigen, verwenden Sie MsgBox oder ToolTip. Für komplexe Skripte siehe Interaktives Debuggen.

Warum ist die Run-Funktion nicht in der Lage, mein Videospiel oder Programm auszuführen?

Einige Programme müssen in ihrem eigenen Verzeichnis gestartet werden (was im Zweifelsfall immer getan werden sollte). Zum Beispiel:

Run ProgramFiles "\Beliebige Anwendung\Anwendung.exe", ProgramFiles "\Beliebige Anwendung"

Wenn Sie mit der 32-Bit-Version von AutoHotkey auf einem 64-Bit-System ein Programm starten wollen, das sich im Ordner A_WinDir "\System32" befindet, kann es sein, dass die Dateisystemumleitung Probleme macht. Um das zu umgehen, können Sie stattdessen A_WinDir "\SysNative" verwenden; dieser Pfad führt zu einem virtuellen Verzeichnis, das nur 32-Bit-Programme auf einem 64-Bit-System sehen können.

Warum werden ASCII-fremde Zeichen in meinem Skript falsch dargestellt oder gesendet?

Kurze Antwort: Speichern Sie das Skript unter UTF-8, vorzugsweise mit BOM.

ASCII-fremde Zeichen haben je nach gewählter Kodierung unterschiedliche Binärwerte. Damit solche Zeichen korrekt interpretiert werden, müssen Ihr Texteditor und AutoHotkey sozusagen die gleiche Codepage verwenden. AutoHotkey v2 verwendet standardmäßig UTF-8 für alle Skriptdateien, was aber mit der Befehlszeilenoption /CP überschrieben werden kann.

Es wird empfohlen, das Skript unter UTF-8 mit BOM (Byte Order Mark) zu speichern, um sicherzustellen, dass Editoren (und möglicherweise andere Programme) zweifelsfrei erkennen können, dass die Datei UTF-8 ist. Ohne BOM muss der Editor die Kodierung der Datei erraten, was manchmal falsch sein kann.

Um eine Datei in Notepad unter UTF-8 zu speichern, wählen Sie UTF-8 oder UTF-8 mit BOM in der ausklappbaren Liste neben Kodierung im Dialogfenster "Speichern unter" aus. Beachten Sie, dass Notepad in Windows 10 v1903 und höher standardmäßig UTF-8 (ohne BOM) verwendet.

Um BOM-lose UTF-8-Dateien zu lesen, verwenden Sie FileEncoding "UTF-8-RAW", die *P65001-Option mit FileRead oder "UTF-8-RAW" im dritten Parameter von FileOpen. Sie können das -RAW-Suffix weglassen, aber dann werden alle neuen Dateien eine BOM haben.

Beachten Sie, dass INI-Dateien, die mit den Standard-INI-Funktionen gelesen oder geschrieben werden, UTF-8 nicht unterstützen; sie müssen unter ANSI oder UTF-16 gespeichert sein.

Warum funktionieren Hotstrings, Send und Click in einigen Videospielen nicht?

Nicht immer ist es bei Videospielen möglich, ihnen Tasten oder Mausklicks zu senden oder ihre Pixelfarben zu lesen.

Es gibt jedoch einige Alternativen, die Sie ausprobieren können. Wenn alle fehlschlagen, ist AutoHotkey möglicherweise nicht für Ihr Videospiel geeignet. Einige Videospiele haben eingebaute Maßnahmen gegen Hacks und Cheats, wie z.B. GameGuard und Hackshield. In diesem Fall besteht eine hohe Chance, dass AutoHotkey nicht funktioniert.

Wie kann die Performanz bei Videospielen bzw. in Situationen mit hoher CPU-Last verbessert werden?

Wenn Hotkeys, Clicks oder Sends bei hoher CPU-Last spürbar langsamer als normal sind, kann es helfen, die Prozesspriorität des Skripts zu erhöhen. Fügen Sie dazu die folgende Zeile am Anfang des Skripts ein:

ProcessSetPriority "High"

Mein Antivirenprogramm hat AutoHotkey oder ein kompiliertes Skript als Malware erkannt. Ist das wirklich ein Virus?

Es kann zwar nie ganz ausgeschlossen werden, dass die Datei infiziert ist, aber in den meisten Fällen handelt es sich bei solchen Warnungen um False-Positives (Falschmeldungen), d.h. das Antivirenprogramm irrt sich. Oft wird vorgeschlagen, die Datei bei einem Onlinedienst wie virustotal oder Jotti hochzuladen, um zu sehen, was andere Antivirenprogramme melden. Im Zweifelsfall kann man die Datei an den Hersteller des Antivirenprogramms schicken und sich die Echtheit bestätigen lassen. Das würde auch uns und anderen AutoHotkey-Benutzern helfen, da der Hersteller diese Warnung möglicherweise als False-Positive einstuft und sein Programm so anpasst, dass es reibungslos mit AutoHotkey funktioniert.

False-Positives können häufiger auftreten, wenn kompilierte Skripte mit UPX (Standard in AutoHotkey 1.0, aber nicht in 1.1) oder MPRESS (optional in AutoHotkey 1.1) komprimiert sind. Da die Standardinstallation von AutoHotkey keinen Kompressor enthält, werden kompilierte Skripte standardmäßig nicht komprimiert.

Allgemeine Aufgaben

Wo finde ich den offiziellen Build oder ältere Versionen?

Auf der Download-Seite von AutoHotkey.

Kann ich AHK von einem USB-Laufwerk ausführen?

Siehe Portabilität von AutoHotkey.exe.

Wie kann die Ausgabe einer Befehlszeilenoperation abgerufen werden?

Um die Ausgabe einer Befehlszeilenoperation abzurufen, können Sie eine temporäre Datei verwenden. Tests haben gezeigt, dass diese Methode bei relativ kleinen Ausgaben aufgrund von Datei-Caching sehr schnell sein kann. Tatsächlich wird die Datei oft gar nicht auf das Laufwerk geschrieben, wenn sie sofort nach ihrer Verwendung gelöscht wird. Zum Beispiel:

RunWait A_ComSpec ' /c dir > C:\Meine Temp-Datei.txt'
VarMitInhalt := FileRead("C:\Meine Temp-Datei.txt")
FileDelete "C:\Meine Temp-Datei.txt"

Wenn Sie temporäre Dateien vermeiden wollen (besonders wenn die Ausgabe groß ist), sollten Sie die Shell.Exec()-Methode verwenden, die bei den Beispielen zur Run-Funktion zu finden ist.

Wie kann ein Skript ein anderes Skript schließen, pausieren, suspendieren oder neu laden?

Hier zunächst ein Beispiel, das ein anderes Skript schließt:

DetectHiddenWindows True  ; Ermöglicht die Erkennung des versteckten Hauptfensters eines Skripts.
SetTitleMatchMode 2  ; Verhindert, dass unten der vollständige Pfad der Datei angegeben werden muss.
WinClose "SkriptDateiName.ahk - AutoHotkey"  ; Verwenden Sie hier den Namen Ihres Skripts (Groß-/Kleinschreibung-sensitiv).

Wenn ein anderes Skript suspendiert, pausiert oder neu geladen werden soll, ersetzen Sie die letzte Zeile oben mit eine der folgenden Zeilen:

PostMessage 0x0111, 65305,,, "SkriptDateiName.ahk - AutoHotkey"  ; Suspendieren.
PostMessage 0x0111, 65306,,, "SkriptDateiName.ahk - AutoHotkey"  ; Pausieren.
PostMessage 0x0111, 65303,,, "SkriptDateiName.ahk - AutoHotkey"  ; Neu laden.

Wie kann eine sich wiederholende Aktion gestoppt werden, ohne das Skript zu beenden?

Um das gesamte Skript auf Tastendruck zu pausieren oder fortzusetzen, weisen Sie der Pause-Funktion einen Hotkey wie folgt zu:

^!p::Pause  ; Drücke Strg+Alt+P zum Pausieren. Drücke erneut zum Fortsetzen.

Um eine sich wiederholende Aktion innerhalb einer Schleife zu stoppen, verwenden Sie den folgenden Hotkey, der seine eigene sich wiederholende Aktion sowohl startet als auch stoppt. Durch einmaliges Drücken des Hotkeys wird die Schleife gestartet, durch erneutes Drücken wird sie gestoppt.

#MaxThreadsPerHotkey 3
#z::  ; WIN+Z (passen Sie diesen Hotkey Ihren Bedürfnissen an).
{
    static WinZLaufenLassen := false
    if WinZLaufenLassen  ; Bedeutet, dass ein darunter liegender Thread die Schleife unten bereits ausführt.
    {
        WinZLaufenLassen := false  ; Signalisiert der Schleife zu stoppen.
        return  ; Beendet diesen Thread, damit der darunter liegende weiterläuft und die Änderung von der Zeile oben sieht.
    }
    ; Andernfalls:
    WinZLaufenLassen := true
    Loop
    {
        ; Die nächsten vier Zeilen sind die Aktionen, die wiederholt werden sollen (passen Sie sie Ihren Bedürfnissen an):
        ToolTip "Drücken Sie erneut WIN+Z, um das hier zu stoppen."
        Sleep 1000
        ToolTip
        Sleep 1000
        ; Lassen Sie den Rest aber unverändert.
        if not WinZLaufenLassen  ; Der Benutzer signalisierte den Stopp der Schleife durch erneutes Drücken von WIN+Z.
            break  ; Unterbricht die Schleife.
    }
    WinZLaufenLassen := false  ; Setzt den Wert zum Wiederverwenden des Hotkeys zurück.
}
#MaxThreadsPerHotkey 1

Wie kann eine kontextabhängige Hilfe für AutoHotkey-Funktionen in einem beliebigen Editor verwendet werden?

Rajat hat dafür dieses Skript geschrieben.

Wie kann man feststellen, ob eine Webseite vollständig geladen wurde?

Für den Internet Explorer ist DllCall in Kombination mit COM wohl die zuverlässigste Methode; ein Beispiel dazu finden Sie in diesem archivierten Forumsthread. Es ist auch möglich, den Inhalt der Adress- und Statusleiste abzurufen, wie in diesem archivierten Forumsthread gezeigt.

Ältere, weniger zuverlässige Methode: Das folgende Beispiel funktioniert für fast alle Webseiten des Internet Explorers. Eine ähnliche Methode könnte auch für andere Browser funktionieren:

Run "www.yahoo.com"
MouseMove 0, 0  ; Verhindert, dass aufgrund der Mausposition ein Link in der Statusleiste angezeigt wird.
WinWait "Yahoo! - "
WinActivate
if StatusBarWait("Done", 30)
    MsgBox "Die Webseite wurde geladen."
else
    MsgBox "Die Wartezeit ist abgelaufen oder das Fenster wurde geschlossen."

Wie können Datums- oder Zeitwerte verglichen oder geändert werden?

Die DateAdd-Funktion kann eine bestimmte Anzahl von Tagen, Stunden, Minuten oder Sekunden im YYYYMMDDHH24MISS-Format addieren oder subtrahieren. Das folgende Beispiel subtrahiert 7 Tage von einer bestimmten Zeit:

Ergebnis := DateAdd(VarMitZeitstempel, -7, "days")

Um die Zeitmenge zwischen zwei Datums- oder Zeitwerten zu ermitteln, sehen Sie sich das Beispiel in DateDiff an. Die interne Variable A_Now enthält die aktuelle Ortszeit. Des Weiteren gibt es mehrere interne Datum/Zeit-Variablen, sowie die FormatTime-Funktion, um eine benutzerdefinierte Datum/Zeit-Zeichenkette zu erzeugen.

Wie kann ich das aktuelle Datum und/oder die aktuelle Uhrzeit senden?

Mit FormatTime oder internen Datum/Zeit-Variablen.

Wie kann ich Text an ein Fenster senden, das weder aktiv noch sichtbar ist?

Mit ControlSend.

Wie kann Winamp auch dann gesteuert werden, wenn es nicht aktiv ist?

Siehe Winamp automatisieren.

Wie können die Namen der MsgBox-Schaltflächen geändert werden?

Hier dazu ein Beispiel.

Wie kann ich den Standardeditor ändern, den man via Kontextmenü oder Tray-Symbol öffnen kann?

Im Beispielabschnitt von Edit finden Sie ein Skript, mit dem Sie den Standardeditor ändern können.

Wie kann ich den Inhalt aller GUI-Steuerelemente speichern?

Mit Gui.Submit. Zum Beispiel:

MeineGui := Gui()
MeineGui.Add("Text",, "Tragen Sie etwas Text ein und drücken Sie Submit:")
MeineGui.Add("Edit", "vMeinEdit")
MeineGui.Add("Button",, "Submit").OnEvent("Click", Submit)
MeineGui.Show

Submit(*)
{
    Gespeichert := MeineGui.Submit(false)
    MsgBox "Inhalt des Edit-Steuerelements: " Gespeichert.MeinEdit
}

Kann ich mit AHK etwas zeichnen?

Siehe GDI+ standard library von tic. Mit Gui kann man auch etwas zeichnen, aber nur sehr rudimentär.

Wie kann ich eine Aktion starten, wenn ein Fenster erscheint, geschlossen oder [in]aktiv wird?

Mit WinWait, WinWaitClose oder WinWait[Not]Active.

Es gibt von Benutzern erstellte Lösungen wie OnWin.ahk und [How to] Hook on to Shell to receive its messages (wie man auf Shell zugreifen kann, um dessen Meldungen abzurufen) im archivierten Forum.

Hotkeys, Hotstrings und Neubelegung

Wie kann ich erreichen, dass meine Hotkeys und Hotstrings automatisch bei jedem PC-Start verfügbar sind?

Es gibt mehrere Möglichkeiten, ein Skript (oder ein anderes Programm) beim Start von Windows auszuführen. Am einfachsten ist es, eine Verknüpfung zur Skriptdatei im Autostart-Ordner zu platzieren:

  1. Finden Sie die Skriptdatei, markieren Sie sie und drücken Sie Strg+C.
  2. Drücken Sie Win+R, um das Ausführen-Dialogfenster zu öffnen, geben Sie shell:startup ein und klicken Sie auf OK oder drücken Sie Enter. Der Autostart-Ordner des aktuellen Benutzers wird geöffnet. Um stattdessen den Ordner aller Benutzer zu öffnen, geben Sie shell:common startup ein (in diesem Fall benötigen Sie jedoch Adminrechte).
  3. Machen Sie einen Rechtsklick innerhalb des Fensters und klicken Sie auf "Verknüpfung einfügen". Die Verknüpfung des Skripts sollte nun im Autostart-Ordner sein.

Ich habe Schwierigkeiten, meine Maustasten als Hotkeys zu definieren. Irgendwelche Tipps?

Die linke und rechte Maustaste sollten normal belegbar sein (z.B. ist #LButton:: der Hotkey Win+MAUSTASTE-LINKS). Die mittlere Maustaste und das Mausrad sollten ebenfalls normal belegbar sein, außer bei Mäusen, deren Tasten direkt vom Treiber gesteuert werden.

Die vierte (XButton1) und fünfte Maustaste (XButton2) können ebenfalls belegt werden, sofern Ihr Maustreiber diese Klicks für das System erkennbar macht. Wenn das System diese Tasten nicht erkennt (oder um neben den 5 Haupttasten noch andere Maustasten erkennbar zu machen), können Sie versuchen, die Maus mittels eigener Software so einzustellen (manchmal über die Systemsteuerung oder das Startmenü zugänglich), dass sie einen Tastendruck sendet, wenn Sie eine dieser Maustasten drücken. Dieser Tastendruck kann dann in einem Skript als Hotkey definiert werden. Wenn Sie zum Beispiel die vierte Maustaste so einstellen, dass sie Strg+F1 sendet, können Sie diese Maustaste indirekt als Hotkey definieren, indem Sie ^F1:: in einem Skript verwenden.

Wenn Sie eine 5-Tasten-Maus besitzen, aber das System die vierte und fünfte Maustaste nicht erkennt, können Sie versuchen, den Maustreiber mit dem Standardtreiber des Betriebssystems zu ersetzen. Dies setzt voraus, dass so ein Treiber für Ihre Maus vorhanden ist und dass Sie auf die Features, die die Software Ihrer Maus normalerweise bereitstellt, verzichten können.

Wie können Tabulator und Leertaste als Hotkeys definiert werden?

Benutzen Sie die englischen Namen dieser Tasten (Tab und Space). Zum Beispiel: #Space ist Win+Leer und ^!Tab ist Strg+Alt+Tab.

Wie können Tastatur- oder Maustasten zu anderen Tasten umbelegt werden?

Informationen dazu finden Sie unter Neubelegung von Tasten.

Wie kann ich einen doppelten Tastendruck oder Mausklick erkennen?

Verwenden Sie die internen Hotkey-Variablen wie folgt:

~Ctrl::
{
    if (ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200)
        MsgBox "Doppeldruck"
}

Wie kann ein Hotkey oder Hotstring exklusiv für ein bestimmtes Programm gemacht werden? Mit anderen Worten, ich möchte eine bestimmte Taste dazu bringen, etwas anderes zu tun, wenn ein bestimmtes Fenster aktiv ist.

Die bevorzugte Methode ist #HotIf. Zum Beispiel:

#HotIf WinActive("ahk_class Notepad")
^a::MsgBox "Sie haben STRG+A gedrückt, während Notepad aktiv ist."

Wie kann man eine sonst funktionslose Präfixtaste dazu bringen, ihre ursprüngliche Funktion auszuführen?

Das folgende Beispiel macht aus Numpad0 eine Präfixtaste:

Numpad0 & Numpad1::MsgBox "Sie haben Numpad1 gedrückt, während Sie Numpad0 gedrückt hielten."

Um nun Numpad0 dazu zu bringen, immer dann einen echten Numpad0-Tastendruck zu senden, wenn die Taste nicht zum Starten eines Hotkeys wie oben benötigt wird, fügen Sie den folgenden Hotkey hinzu:

 $Numpad0::Send "{Numpad0}"

Das $-Präfix ist notwendig, um ein Warndialogfenster im Falle einer Endlosschleife zu unterdrücken (da der Hotkey "sich selbst sendet"). Außerdem wird die obige Aktion erst ausgelöst, wenn die Taste losgelassen wird.

Wie können systeminterne Tastaturkurzbefehle wie WIN+U (Eingabehilfe) und WIN+R (Ausführen) geändert oder deaktiviert werden?

Hier einige Beispiele.

Kann ich Platzhalter oder reguläre Ausdrücke in Hotstrings verwenden?

Verwenden Sie das Skript von polyethene (Beispiele sind enthalten).

Wie kann ich einen Hotkey verwenden, der in meiner Tastaturbelegung nicht existiert?

Siehe Sondertasten.

Meine Tastatur hat die 000-Taste. Ist es möglich, diese Taste in einen Hotkey umzuwandeln?

Ja, es ist möglich. Dieses Beispiel-Skript lässt 000 ein Gleichheitszeichen senden. Um stattdessen eine andere Aktion ausführen zu lassen, ersetzen Sie Send "=" mit eine oder mehrere Zeilen Ihrer Wahl.