Hotkey

Erstellt, bearbeitet, aktiviert oder deaktiviert ein Hotkey, während das Skript läuft.

Hotkey, Tastenname [, Label, Optionen]
Hotkey, IfWinActive/Exist [, Fenstertitel, Fenstertext]
Hotkey, If [, Ausdruck]
Hotkey, If, % Funktionsobjekt

Parameter

Tastenname

Name der Taste zum Aktivieren des Hotkeys, einschließlich Modifikatorzeichen. Zum Beispiel wäre #c der Hotkey WIN+C.

Wenn Tastenname bereits als Hotkey existiert, wird dieser Hotkey mit den anderen Parameterwerten des Befehls aktualisiert.

Tastenname kann auch der Name eines vorhandenen Hotkey-Labels sein (z. B. ein Doppelpunkt-Label), was dazu führen würde, dass dieser Hotkey mit den anderen Parameterwerten des Befehls aktualisiert wird.

Wenn der angegebene Hotkey bereits existiert, spielt die Groß- und Kleinschreibung bei Tastenname keine Rolle. Allerdings müssen die Namen der Tasten mit den Tastennamen im vorhandenen Hotkey übereinstimmen (zum Beispiel wäre hierbei das Esc nicht das gleiche wie Escape). Zudem ist es egal, wie die Modifikatorzeichen (z. B. ^!+#) angeordnet sind. Mit GetKeyName kann die Standardschreibweise eines Tastennamens abgerufen werden.

Erstellt man ein Hotkey das erste Mal - entweder durch den Hotkey-Befehl oder einen Doppelpunkt-Label innerhalb des Skripts - besteht sein permanenter Name aus seinem Tastennamen und die Reihenfolge seiner Modifikatorzeichen, der auch in A_ThisHotkey zu finden ist. Dieser Name gilt für alle Varianten des Hotkeys, und ändert sich auch dann nicht, wenn der Hotkey-Befehl später auf den Hotkey mit unterschiedlicher Symbolreihenfolge zugreift.

[v1.1.15+]: Wenn die Hotkey-Variante bereits vorhanden ist, wird sein Verhalten gemäß der Tatsache aktualisiert, ob Tastenname den Tilde-Präfix (~) enthält oder nicht. Allerdings wurde der Hotkey vor v1.1.19 nicht aktualisiert, wenn Label weggelassen wurde.

[v1.1.19+]: Das Hook-Präfix ($) kann bei vorhandenen Hotkeys eingefügt werden. Dieses Präfix beeinflusst alle Varianten des Hotkeys und kann nicht entfernt werden. Vor v1.1.19 wurde das Präfix beim Modifizieren einer vorhandenen Hotkey-Variante ignoriert.

Label

Name des Labels, dessen Inhalt beim Drücken des Hotkeys ausgeführt werden soll (als neuer Thread). Es können sowohl normale Label als auch Hotkey/Hotstring-Label verwendet werden. Der eine oder die zwei Doppelpunkte nach dem Labelnamen müssen weggelassen werden. Wenn das Label dynamisch ist (z. B. %VarMitLabelnamen%), könnte man davor IsLabel(VarMitLabelnamen) aufrufen, um zu überprüfen, ob das Label überhaupt vorhanden ist.

[v1.1.20+]: Wenn es kein gültiger Labelname ist, kann dieser Parameter der Name einer Funktion sein, oder ein einzelner Variablenverweis mit einem Funktionsobjekt. Zum Beispiel Hotkey %funkobj%, On oder Hotkey % funkobj, On. Andere Ausdrücke, die Objekte zurückgeben, werden zurzeit nicht unterstützt. Beim Ausführen des Hotkeys wird die Funktion ohne Parameter aufgerufen. Hotkeys können auch ohne Hotkey-Befehl als Funktionen definiert werden.

Dieser Parameter kann leer gelassen werden, wenn Tastenname bereits als Hotkey existiert - in diesem Fall bleibt sein Label unverändert. Diese Vorgehensweise ist sinnvoll, wenn man nur die Optionen des Hotkeys ändern will.

Wenn das Label oder die Funktion angegeben ist, und wurde der Hotkey durch diesen Befehl zuvor deaktiviert, bleibt der Hotkey deaktiviert. Um dies zu verhindern, muss das Wort ON in den Optionen eingefügt werden.

Dieser Parameter kann außerdem einer der folgenden speziellen Werte sein:

On: Der Hotkey wird aktiviert. Wirkungslos, wenn der Hotkey bereits On ist.

Off: Der Hotkey wird deaktiviert. Wenn der Hotkey bereits Off ist, wird keine Aktion ausgeführt.

Toggle: Der Status des Hotkeys wird umgekehrt (aktiviert oder deaktiviert).

AltTab (und andere): Es gibt spezielle Alt-Tab-Hotkey-Aktionen, die hier beschrieben sind.

Vorsicht: Das Benennen des Labels in On, Off, Toggle oder AltTab (oder Variationen davon, die von diesem Befehl erkannt werden) kann zu inkonsistentem Verhalten führen. Es wird dringend emfohlen, diese Werte nicht als Labelnamen zu verwenden.

Optionen

Eine Zeichenkette mit null oder mehreren der folgenden Buchstaben, optional getrennt durch Leerzeichen. Zum Beispiel: UseErrorLevel B0.

UseErrorLevel: Stößt der Befehl auf ein Problem, wird diese Option das Warnungsfenster überspringen, ErrorLevel auf einen der Codes aus der unteren Tabelle setzen und dann den aktuellen Thread fortsetzen.

On: Aktiviert den Hotkey, falls er zuvor deaktiviert wurde.

Off: Deaktiviert den Hotkey, falls er zuvor aktiviert wurde. Diese Option ist normalerweise zum Erstellen eines Hotkeys gedacht, der zu Beginn im deaktivierten Zustand ist.

B oder B0: Verwende den Buchstaben B, um den Hotkey zwischenzuspeichern, wie in #MaxThreadBuffer beschrieben. Verwende B0 (B mit der Nummer 0), um diese Art der Zwischenspeicherung zu deaktivieren.

Pn: Verwende den Buchstaben P, gefolgt von der Thread-Priorität des Hotkeys. Fehlt die P-Option beim Erstellen eines Hotkeys, gilt eine Priorität von 0.

Tn: Verwende den Buchstaben T, gefolgt von der maximalen Anzahl an Threads für diesen Hotkey, wie in #MaxThreadsPerHotkey beschrieben. Zum Beispiel: T5.

In (InputLevel) [v1.1.23+]: Verwende den Buchstaben I (oder i), gefolgt von der Eingabestufe des Hotkeys. Zum Beispiel: I1.

Fehlt einer der Optionsbuchstaben, während der Hotkey bereits existiert, bleiben diese Optionen unverändert. Sollte der Hotkey aber noch nicht vorhanden sein (das heißt, wenn er kurz davor ist, von diesem Befehl erstellt zu werden), gelten als Optionen standardmäßig solche, die gerade eben aktiv sind. Zum Beispiel wäre nur die #MaxThreadsBuffer-Direktive, die dem Skript-Ende am nächsten ist, die aktuell verwendete. Wenn die #MaxThreadsBuffer-Direktive im Skript nicht vorkommt, gilt ihre Standardeinstellung (in diesem Fall OFF). Dieses Verhalten trifft auch auf #IfWin zu: Nur das unterste Vorkommen gilt für neu erstellte Hotkeys, sofern nach dem Starten des Skripts kein "Hotkey IfWin" ausgeführt wurde.

IfWinActive
IfWinExist
IfWinNotActive
IfWinNotExist
If, Ausdruck
If, % Funktionsobjekt

Diese Unterbefehle machen alle danach erstellten Hotkeys kontextabhängig. Siehe unten für weitere Details.

Fenstertitel
Fenstertext

Innerhalb dieser Parameter wird jeder Variablenverweis wie %var% dauerhaft wirksam, nachdem der Befehl durchgeführt wurde. Das heißt, dass nachfolgende Änderungen an den Variableninhalten nicht von vorhandenen IfWin-Hotkeys gesehen werden können.

Beim Fenstertitel und Fenstertext gelten, wie bei #IfWinActive/Exist auch, die Standardeinstellungen von SetTitleMatchMode und DetectHiddenWindows, die im automatischen Ausführungsbereich bestimmt wurden. Siehe #IfWinActive/Exist für weitere Details.

If, Ausdruck

[AHK_L 4+]: Verbindet nachfolgend erstellte Hotkeys mit dem angegebenen #If-Ausdruck. Ausdruck muss ein Ausdruck sein, der irgendwo im Skript mit der #If-Direktive verwendet wurde. Zwar kann dieser Befehl keine neuen Ausdrücke erstellen, allerdings kann er neue Hotkeys unter Verwendung eines vorhandenen Ausdrucks erstellen. Siehe 4. Beispiel von #If.

Hinweis: Der Hotkey-Befehl benutzt die Zeichenkette, die du ihm gegeben hast, nicht den ursprünglichen Quellcode. Kommas und Dereferenzzeichen (Prozentzeichen) werden interpretiert, bevor der Befehl aufgerufen wird, und müssen daher mit Escapezeichen versehen werden, wenn sie zum ursprünglichen Ausdruck gehören. Escapesequenzen werden aufgelöst, während das Skript geladen wird, demzufolge werden nur die resultierenden Zeichen berücksichtigt; Zum Beispiel sind Hotkey, If, x = "`t" und Hotkey, If, % "x = """ A_Tab """" das gleiche wie #If x = "`t".

Bekannte Einschränkung: Enthält Ausdruck einen AND/OR-Operator, wird er nicht als vorhandener Ausdruck anerkannt. Als Übergangslösung kann man den gleichwertigen &&/||-Operator verwenden - sowohl im originalen #If-Ausdruck als auch in dem, der an den Hotkey-Befehl übergeben wurde.

If, % Funktionsobjekt

[v1.1.25+]: Verbindet nachfolgend erstellte Hotkeys mit dem angegebenen Funktionsobjekt. Solche Hotkeys werden nur ausgeführt, wenn der Aufruf des angegebenen Funktionsobjekts eine Zahl ungleich 0 zurückgibt. Das ist wie Hotkey, If, Ausdruck, außer dass jeder Hotkey mehrere Varianten haben kann (eine pro Objekt). Funktionsobjekt muss eine einzelne Variable sein (kein Ausdruck), die ein Objekt mit einer Call-Methode enthält. Die Funktion oder Call-Methode kann einen Parameter akzeptieren - den Namen des Hotkeys.

Sobald das Objekt an dem Hotkey-Befehl übergeben wurde, wird es nie gelöscht (aber Speicher vom Betriebssystem zurückgefordert, wenn der Prozess beendet wird).

Das Drei-Tasten-Kombinations-Beispiel unten benutzt diesen Unterbefehl.

ErrorLevel

[v1.1.04+] Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Für mehr Informationen, siehe Laufzeitfehler.

ErrorLevel ändert sich nur, wenn: 1) der erste Parameter IfWin[Not]Active/Exist ist - in diesem Fall wird ErrorLevel bei Misserfolg auf 1 und bei Erfolg auf 0 gesetzt; oder 2) das Wort UseErrorLevel in den Optionen vorhanden ist.

[v1.1.25+]: Ist der erste Parameter "If", wird eine Ausnahme ausgelöst, wenn der zweite Parameter ungültig ist oder eine Speicherzuweisung fehlschlägt. ErrorLevel wird in solchen Fällen nicht gesetzt, aber wäre bei Erfolg immer noch 0.

Fehler Beschreibung
1 Der Label-Parameter verweist auf einen nicht-existierenden Labelnamen.
2 Der Tastenname-Parameter enthält eine oder mehrere Tasten, die weder erkannt noch von der aktuellen Tastaturbelegung/Sprache unterstützt werden.
3 Nicht unterstützte Präfixtaste. Zum Beispiel wäre das Verwenden des Mausrades als Präfix in einem Hotkey wie WheelDown & Enter nicht gültig.
4 Der Tastenname-Parameter ist nicht für die Verwendung mit AltTab oder ShiftAltTab geeignet. Es müssen immer zwei Tasten kombiniert werden. Zum Beispiel: RControl & RShift::AltTab.
5 Der Befehl versucht, einen nicht-existierenden Hotkey zu ändern.
6 Der Befehl versucht, eine nicht-existierende Variante eines vorhandenen Hotkeys zu ändern. Um dieses Problem zu beheben, kann man mit Hotkey IfWin die Kriterien so setzen, dass sie mit den Kriterien des Hotkeys übereinstimmen, die geändert werden sollen.
98 Dieser Hotkey würde das 1000-Hotkeys-pro-Skript-Limit überschreiten (allerdings darf jeder Hotkey unendlich viele Varianten haben; und die Anzahl der Hotstrings ist unbegrenzt).
99 Nicht genug Arbeitsspeicher. Das ist sehr selten und passiert für gewöhnlich nur, wenn das Betriebssystem instabil ist.


Tipp: Mit UseErrorLevel kann überprüft werden, ob eine Hotkey-Variante vorhanden ist. Zum Beispiel:

Hotkey, ^!p,, UseErrorLevel
if ErrorLevel in 5,6
   MsgBox Der Hotkey ist weder vorhanden noch hat er eine Variante mit den aktuellen IfWin-Kriterien.

Bemerkungen

Die aktuelle Einstellung von IfWin bestimmt die Variante eines Hotkeys, auf die sich der Hotkey-Befehl beziehen wird.

Wenn das Ziel darin besteht, basierend auf den Typ des aktiven Fensters bestimmte Hotkeys oder Hotstrings automatisch zu deaktivieren, dann ist Hotkey, ^!c, Off in der Regel weniger gut geeignet als #IfWinActive/Exist (oder das dynamische Gegenstück Hotkey, IfWinActive/Exist).

Das Erstellen von Hotkeys via Zweifach-Doppelpunkt-Label erzielt bessere Performance als via Hotkey-Befehl, weil die Hotkeys beim Starten des Skripts nicht einzeln, sondern gleichzeitig aktiviert werden. Daher sollte man mit diesem Befehl am besten nur Hotkeys erstellen, deren Tastennamen erst nach dem Starten des Skripts bekannt sind. Dies wäre zum Beispiel der Fall, wenn die Skript-Hotkeys mit verschiedenen Aktionen via INI-Datei konfigurierbar sind.

Ein angegebener Label kann das Ziel von mehreren Hotkeys sein. Wenn bekannt ist, dass ein Label durch einen Hotkey aufgerufen wurde, kannst du mit der Built-in-Variable A_ThisHotkey überprüfen, welcher Hotkey das war.

Beim Unterbrechen des Skripts via Suspend werden neu hinzugefügte/aktivierte Hotkeys auch unterbrochen, bis die Suspend-Unterbrechung wieder aufgehoben wird (sofern sie nicht davon ausgenommen werden, wie im Suspend-Abschnitt beschrieben).

Die Tastatur- und/oder Maus-Hooks werden bei diesem Befehl je nach Bedarf automatisch installiert oder entfernt.

Zwar kann der Hotkey-Befehl Hotkeys von anderen Skripten nicht direkt aktivieren oder deaktivieren, allerdings kann er sie durch Erstellen oder Aktivieren der gleichen Hotkeys überschreiben. Das hängt von mehreren Faktoren ab: 1) Ob der Hotkey, der überschrieben werden soll, ein Hook-Hotkey im anderen Skript ist (Hotkeys ohne Hook können immer überschrieben werden); 2) Die Tatsache, dass die zuletzt gestarteten Hotkeys im Skript generell Vorrang vor den Hotkeys aus den anderen Skripten haben; 3) Ob der Tastatur- oder Maus-Hook beim Aktivieren oder Erstellen des Hotkeys erneut aktiviert wird (in diesem Fall ist das Überschreiben immer erfolgreich).

Sobald ein Skript mindestens einen Hotkey hat, wird es persistent; das heißt, dass ExitApp anstelle von Exit verwendet werden muss, um dieses Skript beenden zu können. Hotkey-Skripte sind zudem automatisch #SingleInstance (einzeln vorkommend), sofern nicht #SingleInstance, Off verwendet wurde.

Bemerkungen zu Hotkey, If

Die "Hotkey If"-Befehle erlauben das Erstellen oder Ändern von kontextabhängigen Hotkeys, während das Skript läuft (Direktiven wie #IfWinActive/Exist sind hingegen von der Position abhängig und werden bereits vor dem Ausführen des Skripts wirksam). Zum Beispiel:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!e, MeinLabel  ; Erstellt einen Hotkey, der nur im Texteditor funktioniert.

Das Verwenden von "Hotkey If" macht alle danach erstellten oder geänderten Hotkeys kontextabhängig. Darüber hinaus schließen sich die If-Unterbefehle gegenseitig aus; das heißt, dass nur der aktuellste Unterbefehl aktiv sein wird.

Um die Kontextabhängigkeit zu deaktivieren (so dass danach erstellte Hotkeys für alle Fenster gelten), muss ein beliebiger If-Unterbefehl ohne Parameter angegeben werden. Zum Beispiel: Hotkey, If oder Hotkey, IfWinActive.

Sollte "Hotkey If" nie im Skript verwendet werden, wird nur die zuletzt verwendete #If- oder #IfWin-Direktive (falls vorhanden) für den Hotkey-Befehl wirksam.

Wenn ein Maus- oder Tastatur-Hotkey via If-Unterbefehl oder Direktive deaktiviert wurde, wird er seine ursprüngliche Funktion durchführen; das heißt, dass er an das aktive Fenster übergeben wird, als gäbe es diesen Hotkey nicht. Joystick-Hotkeys werden allerdings immer übergeben, egal ob sie deaktiviert sind oder nicht.

Hotkey-Varianten (-Duplikate)

Ein bestimmter Hotkey kann mehr als einmal erstellt werden, wenn für jede Definition ein anderes IfWin-Kriterium angegeben wird. Auch bekannt als Hotkey-Varianten. Zum Beispiel:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MeinLabelFürNotepad
Hotkey, IfWinActive, ahk_class WordPadClass
Hotkey, ^!c, MeinLabelFürWordPad
Hotkey, IfWinActive
Hotkey, ^!c, MeinLabelFürAlleAnderenFenster

Bei mehreren gleichzeitig aktiven Varianten eines Hotkeys wird nur die zuerst erstellte Variante ausgelöst. Die Ausnahme davon ist die globale Variante (ohne IfWin-Kriterium): Sie hat immer die niedrigste Priorität, daher wird sie nur ausgelöst, wenn keine andere Variante dazu in der Lage ist.

Beim Erstellen von Hotkey-Duplikaten spielt die Reihenfolge der Modifikatorzeichen (z. B. ^!+#) keine Rolle. Zum Beispiel wäre ^!c das gleiche wie !^c. Allerdings müssen die Tasten konsequent ausgeschrieben werden. Zum Beispiel wäre in diesem Fall Esc nicht das gleiche wie Escape (die Groß- und Kleinschreibung ist hingegen egal). Außerdem werden Hotkeys mit einem Platzhalter-Präfix (*) und Hotkeys ohne Platzhalter getrennt behandelt; zum Beispiel hätten *F1 und F1 jeweils ihre eigenen Varianten.

Siehe Bemerkungen zu #IfWin, um mehr über IfWin-Hotkeys zu erfahren.

Siehe auch

Hotkey-Symbole, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer

Beispiele

Hotkey, ^!z, MeinLabel
return

MeinLabel:
MsgBox Sie haben %A_ThisHotkey% gedrückt.
return

; Andere Beispiele:
Hotkey, RCtrl & RShift, AltTab ; Veranlasst RCtrl & RShift, sich wie Alt-Tab zu verhalten.
Hotkey, #c, On  ; Reaktiviert den Hotkey WIN+C.
Hotkey, $+#c, Off  ; Deaktiviert den Hotkey UMSCHALT+WIN+C.
Hotkey, ^!a, , T5  ; Erlaubt 5 Threads für diesen Hotkey.

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MeinLabelFürNotepad  ; Erstellt STRG+ALT+C als Hotkey, der nur im Texteditor funktioniert.
; Mit diesem GUI kannst du primitive Drei-Tasten-Kombinations-Hotkeys registrieren:
Gui Add, Text, xm, Präfixtaste:
Gui Add, Edit, yp x100 w100 vPräfix, Space
Gui Add, Text, xm, Suffix-Hotkey:,
Gui Add, Edit, yp x100 w100  vSuffix, f & j
Gui Add, Button, Default, Registrieren
Gui Show
return

ButtonRegistrieren() {
    global
    Gui Submit, NoHide
    local fn
    fn := Func("HotkeySollteAuslösen").Bind(Präfix)
    Hotkey If, % fn
    Hotkey % Suffix, HotkeyAuslösen
}

HotkeySollteAuslösen(Präfix, thisHotkey) {
    return GetKeyState(Präfix)
}

HotkeyAuslösen() {
    MsgBox %A_ThisHotkey%
}

GuiClose:
GuiEscape:
ExitApp