Hotkey

Erstellt, modifiziert, aktiviert oder deaktiviert einen Hotkey, während das Skript läuft.

Hotkey, TasteName , Label, Optionen
Hotkey, IfWinActive/Exist , FensterTitel, FensterText
Hotkey, If , Ausdruck
Hotkey, If, % FunktionObjekt

Parameter

TasteName

Name der Taste zum Aktivieren des Hotkeys, optional mit Modifikatorsymbolen. Zum Beispiel wäre #c der Hotkey Win+C.

Wenn TasteName bereits als Hotkey existiert - entweder via Hotkey-Befehl oder Zweifach-Doppelpunkt-Label - wird dieser Hotkey mit den anderen Parameterwerten des Befehls aktualisiert.

Wenn der angegebene Hotkey bereits existiert, ist TasteName nicht Groß-/Kleinschreibung-sensitiv. Die Namen der Tasten müssen jedoch genauso geschrieben werden wie die des existierenden Hotkeys (z.B. ist Esc in diesem Fall nicht dasselbe wie Escape). Die Reihenfolge von Modifikatorsymbolen wie z.B. ^!+# spielt keine Rolle. Mit GetKeyName() kann die Standardschreibweise eines Tastennamens abgerufen werden.

Jeder neu erstellte Hotkey - entweder via Hotkey-Befehl oder Zweifach-Doppelpunkt-Label - erhält einen festen Namen, der sich aus dem Tastennamen und der Reihenfolge der Modifikatorsymbolen zusammensetzt, widergespiegelt durch A_ThisHotkey. Dieser Name wird von allen Varianten des Hotkeys verwendet, und ändert sich auch dann nicht, wenn der Hotkey-Befehl später mit einer anderen Symbolreihenfolge auf den Hotkey zugreift.

[v1.1.15+]: Wenn die Hotkey-Variante bereits existiert, wird ihr Verhalten gemäß der Tatsache aktualisiert, ob TasteName das Tilde-Präfix (~) enthält oder nicht. Vor [v1.1.19] wurde der Hotkey jedoch nicht aktualisiert, wenn Label weggelassen wurde.

[v1.1.19+]: Das Hook-Präfix ($) kann auf existierende Hotkeys angewendet 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 existierenden 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 Labels als auch Hotkey-/Hotstring-Labels verwendet werden, aber wenn das Skript mehrere Labels mit demselben Namen enthält, kann nur das erste verwendet werden. Die Doppelpunkte am Ende müssen weggelassen werden. Wenn Label dynamisch ist (z.B. %VarMitLabelName%), prüfen Sie vorher mit IsLabel(VarMitLabelName), ob das Label existiert.

[v1.1.20+]: Dieser Parameter kann auch der Name einer Funktion sein, wenn kein Label mit diesem Namen existiert, oder eine einzelne Variablenreferenz mit einem Funktionsobjekt, wie in Hotkey #z, %FunkObj%, On oder Hotkey #z, % 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 den Hotkey-Befehl als Funktionen definiert werden.

Dieser Parameter kann leer gelassen werden, wenn TasteName bereits als Hotkey existiert - in diesem Fall bleibt sein Label unverändert. Dies ist z.B. nützlich, um nur die Optionen des Hotkeys zu ändern.

Hinweis: Wenn das Label oder die Funktion angegeben ist, aber der Hotkey durch eine frühere Verwendung dieses Befehls deaktiviert wurde, bleibt der Hotkey deaktiviert. Um das zu verhindern, fügen Sie das Wort ON in Optionen ein.

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

On: Aktiviert den Hotkey. Wirkungslos, wenn der Hotkey bereits On ist.

Off: Deaktiviert den Hotkey. Wirkungslos, wenn der Hotkey bereits Off ist.

Toggle: Schaltet den Hotkey auf den entgegengesetzten Zustand (aktiviert oder deaktiviert).

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

Achtung: Die Benennung eines Labels mit On, Off, Toggle oder AltTab (oder einer anderen von diesem Befehl erkannten Variante) kann zu inkonsistentem Verhalten führen. Es wird dringend empfohlen, diese Werte nicht als Labelnamen zu verwenden.

Optionen

Eine Zeichenkette, die aus beliebig vielen der folgenden Optionen besteht, optional durch Leerzeichen getrennt. Zum Beispiel: UseErrorLevel B0.

UseErrorLevel: Wenn der Befehl auf ein Problem stößt, bewirkt diese Option, dass das Warndialogfenster übersprungen wird, ErrorLevel auf einen der Codes aus der unteren Tabelle gesetzt wird und der aktuelle Thread fortgesetzt werden kann.

On: Aktiviert den Hotkey, wenn er aktuell deaktiviert ist.

Off: Deaktiviert den Hotkey, wenn er aktuell aktiviert ist. Dies wird in der Regel verwendet, um einen Hotkey vorerst im deaktivierten Zustand zu erstellen.

B oder B0: Geben Sie den Buchstaben B an, um den Hotkey zu puffern, wie in #MaxThreadBuffer beschrieben. Geben Sie B0 (B mit der Zahl 0) an, um diese Art der Pufferung zu deaktivieren.

Pn: Geben Sie den Buchstaben P an, gefolgt von der Thread-Priorität des Hotkeys. Wenn die P-Option beim Erstellen eines Hotkeys weggelassen wird, wird standardmäßig 0 verwendet.

Tn: Geben Sie den Buchstaben T an, gefolgt von der Anzahl der Threads, die dieser Hotkey maximal haben darf, wie in #MaxThreadsPerHotkey beschrieben. Zum Beispiel: T5.

In (InputLevel) [v1.1.23+]: Geben Sie den Buchstaben I (oder i) an, gefolgt vom Inputlevel des Hotkeys. Zum Beispiel: I1.

Wenn einer der Optionsbuchstaben weggelassen wird und der Hotkey bereits existiert, bleibt diese Option unverändert. Sollte der Hotkey aber noch nicht existieren (also wenn er kurz davor ist, von diesem Befehl erstellt zu werden), gelten als Optionen standardmäßig solche, die gerade eben aktiv sind. Zum Beispiel wird nur die Instanz von #MaxThreadsBuffer verwendet, die dem Ende des Skripts am nächsten ist. Wenn die #MaxThreadsBuffer-Direktive im Skript nicht vorkommt, wird ihre Standardeinstellung (in diesem Fall OFF) verwendet. Dieses Verhalten gilt auch für #IfWin: Nur das unterste Vorkommen gilt für neue Hotkeys, es sei denn, "Hotkey IfWin" wurde seit dem Skriptstart ausgeführt.

IfWinActive
IfWinExist
IfWinNotActive
IfWinNotExist
If, Ausdruck
If, % FunktionObjekt

Diese Unterbefehle machen alle danach erstellten Hotkeys kontextabhängig. Einzelheiten finden Sie unten.

FensterTitel
FensterText

Innerhalb dieser Parameter wird jede Variablenreferenz wie z.B. %var% nach Abschluss des Befehls dauerhaft wirksam. Mit anderen Worten, spätere Änderungen am Inhalt der Variable werden von existierenden IfWin-Hotkeys nicht erkannt.

Wie bei #IfWinActive/Exist verwenden FensterTitel und FensterText die Standardeinstellungen für SetTitleMatchMode und DetectHiddenWindows, die im automatischen Ausführungsbereich gesetzt wurden. Einzelheiten finden Sie unter #IfWinActive/Exist.

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. Obwohl dieser Befehl nicht in der Lage ist, neue Ausdrücke zu erstellen, kann er neue Hotkeys unter Verwendung eines existierenden Ausdrucks erstellen. Siehe 4. Beispiel von #If.

Hinweis: Der Hotkey-Befehl verwendet die Zeichenkette, die Sie ihm übergeben haben, nicht den ursprünglichen Quellcode. Kommas und Dereferenzzeichen (Prozentzeichen) werden vor dem Aufruf des Befehls interpretiert, daher sollten sie jeweils mit einem Escapezeichen versehen werden, wenn sie Teil des ursprünglichen Ausdrucks sind. Escapesequenzen werden beim Laden des Skripts aufgelöst, daher werden nur die resultierenden Zeichen berücksichtigt, z.B. stimmen sowohl Hotkey, If, x = "`t" als auch Hotkey, If, % "x = """ A_Tab """" mit #If x = "`t" überein.

Bekannte Einschränkung: Wenn Ausdruck einen AND/OR-Operator enthält, wird er nicht als existierender Ausdruck erkannt. Um das zu umgehen, verwenden Sie den äquivalenten &&/||-Operator sowohl im ursprünglichen #If-Ausdruck als auch im Ausdruck, der an den Hotkey-Befehl übergeben wurde.

If, % FunktionObjekt

[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. Dies ähnelt Hotkey, If, Ausdruck, außer dass jeder Hotkey mehrere Varianten haben kann (eine pro Objekt). FunktionObjekt 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.

Einmal an den Hotkey-Befehl übergeben, wird das Objekt niemals gelöscht (allerdings wird der beanspruchte Speicher wieder freigegeben, wenn der Prozess beendet wird).

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

Fehlerbehandlung

[v1.1.04+]: Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Weitere Informationen finden Sie unter Laufzeitfehler.

ErrorLevel wird nur geändert, 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+]: Wenn der erste Parameter "If" ist, wird eine Ausnahme ausgelöst, wenn der zweite Parameter ungültig ist oder eine Speicherreservierung fehlschlägt. ErrorLevel wird in solchen Fällen nicht gesetzt, wird aber bei Erfolg immer noch auf 0 gesetzt.

Error Beschreibung
1 Der Label-Parameter enthält einen nicht-existierenden Labelnamen.
2 Der TasteName-Parameter enthält eine oder mehrere Tasten, die entweder nicht erkannt oder von der aktuellen Tastaturbelegung/Sprache nicht unterstützt werden.
3 Nicht unterstützte Präfixtaste. Zum Beispiel wird die Verwendung des Mausrads als Präfix in einem Hotkey wie WheelDown & Enter nicht unterstützt.
4 Der TasteName-Parameter ist nicht für die Verwendung mit AltTab oder ShiftAltTab geeignet. Es ist eine Kombination aus (maximal) zwei Tasten erforderlich. Zum Beispiel: RControl & RShift::AltTab.
5 Der Befehl hat versucht, einen nicht-existierenden Hotkey zu ändern.
6 Der Befehl hat versucht, eine nicht-existierende Variante eines existierenden Hotkeys zu ändern. Um dieses Problem zu lösen, verwenden Sie Hotkey IfWin, um die Kriterien mit denen des zu ändernden Hotkeys abzustimmen.
98 Die Erstellung dieses Hotkeys würde die maximale Anzahl von Hotkeys pro Skript überschreiten (allerdings kann jeder Hotkey unendlich viele Varianten haben; und die Anzahl der Hotstrings ist unbegrenzt). Das Limit wurde in [v1.0.48] von 700 auf 1000 und in [v1.1.30] von 1000 auf 32762 erhöht.
99 Nicht genug Arbeitsspeicher. Dieses Problem tritt sehr selten auf und in der Regel nur dann, wenn das Betriebssystem instabil geworden ist.

Tipp: Mit der UseErrorLevel-Option kann geprüft werden, ob eine Hotkey-Variante existiert. Zum Beispiel:

Hotkey, ^!p,, UseErrorLevel
if ErrorLevel in 5,6
    MsgBox Der Hotkey existiert nicht oder hat keine Variante mit den aktuellen IfWin-Kriterien.

Bemerkungen

Die aktuelle IfWin-Einstellung bestimmt die Variante eines Hotkeys, mit der der Hotkey-Befehl arbeiten wird.

Wenn das Ziel darin besteht, bestimmte Hotkeys oder Hotstrings abhängig vom Typ des aktiven Fensters automatisch zu deaktivieren, dann ist Hotkey, ^!c, Off in der Regel weniger gut geeignet als #IfWinActive/Exist (oder das dynamische Äquivalent Hotkey, IfWinActive/Exist).

Die Erstellung von Hotkeys via Zweifach-Doppelpunkt-Label ist performanter als via Hotkey-Befehl, weil so die Hotkeys beim Start des Skripts gebündelt statt einzeln aktiviert werden können. Daher sollten mit diesem Befehl nur Hotkeys erstellt werden, deren Tastennamen erst nach dem Start des Skripts bekannt sind. Dies ist z.B. der Fall, wenn die Hotkeys eines Skripts über eine INI-Datei konfigurierbar sind.

Ein bestimmtes Label kann das Ziel von mehreren Hotkeys sein. Wenn bekannt ist, dass ein Label durch einen Hotkey aufgerufen wurde, lässt sich der Hotkey durch Überprüfung der internen Variable A_ThisHotkey ermitteln.

Wenn das Skript suspendiert ist und neue Hotkeys hinzugefügt oder aktiviert werden, werden diese ebenfalls suspendiert, bis die Suspension wieder aufgehoben wird (es sei denn, sie sind davor geschützt, wie im Suspend-Abschnitt beschrieben).

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

Obwohl der Hotkey-Befehl nicht in der Lage ist, Hotkeys anderer Skripte direkt zu aktivieren oder zu deaktivieren, kann er sie durch Erstellen oder Aktivieren derselben Hotkeys überschreiben. Ob das funktioniert, hängt von mehreren Faktoren ab: 1) Ob der Hotkey, der überschrieben werden soll, ein Hook-Hotkey im anderen Skript ist (hooklose Hotkeys 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 sollte, um dieses Skript zu terminieren. Hotkey-Skripte sind außerdem automatisch #SingleInstance, es sei denn, #SingleInstance Off wurde angegeben.

Bemerkungen zu Hotkey, If

Die "Hotkey If"-Befehle erlauben das Erstellen oder Ändern von kontextabhängigen Hotkeys, während das Skript läuft (die Direktiven #If und #IfWinActive/Exist sind hingegen positionsabhängig und werden bereits vor Beginn der Skriptausführung wirksam). Zum Beispiel:

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

Die Verwendung von "Hotkey If" macht alle danach erstellten oder geänderten Hotkeys kontextabhängig. Außerdem schließen sich die If-Unterbefehle gegenseitig aus, d.h. nur der aktuellste Unterbefehl ist wirksam.

Um die Kontextabhängigkeit auszuschalten (so dass danach erstellte Hotkeys für alle Fenster wirksam sind), geben Sie einen beliebigen If-Unterbefehl ohne Parameter an. Zum Beispiel: Hotkey, If oder Hotkey, IfWinActive.

Wenn "Hotkey If" nie im Skript verwendet wird, wird die unterste im Skript angegebene #If- oder #IfWin-Direktive (falls vorhanden) für den Hotkey-Befehl wirksam.

Wenn ein Maus- oder Tastatur-Hotkey per If-Unterbefehl oder -Direktive deaktiviert wurde, wird er seine ursprüngliche Funktion ausführen, d.h. der Hotkey wird an das aktive Fenster weitergereicht, als gäbe es ihn nicht. Controller-Hotkeys werden allerdings immer weitergereicht, 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. Diese werden als Hotkey-Varianten bezeichnet. 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

Wenn mehr als eine Variante eines Hotkeys zum Auslösen geeignet ist, wird nur die zuerst erstellte Variante ausgelöst. Ausgenommen ist die globale Variante (die ohne IfWin-Kriterium): Sie hat immer die niedrigste Priorität, also wird sie nur ausgelöst, wenn keine andere Variante zum Auslösen geeignet ist.

Beim Erstellen von Hotkey-Duplikaten spielt die Reihenfolge von Modifikatorsymbolen wie z.B. ^!+# keine Rolle. Zum Beispiel ist ^!c dasselbe wie !^c. Die Tasten müssen jedoch einheitlich geschrieben sein. Zum Beispiel ist Esc in diesem Fall nicht dasselbe wie Escape (Groß-/Kleinschreibung ist jedoch egal). Außerdem werden Hotkeys mit einem Platzhalter-Präfix (*) und platzhalterlose Hotkeys getrennt behandelt, z.B. hätten *F1 und F1 jeweils ihre eigenen Varianten.

Weitere Informationen zu IfWin-Hotkeys finden Sie unter Allgemeine Bemerkungen von #IfWin.

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

Beispiele

Erstellt einen STRG+ALT+Z-Hotkey.

Hotkey, ^!z, MeinLabel
return

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

Veranlasst RCtrl & RShift, sich wie Alt-Tab zu verhalten.

Hotkey, RCtrl & RShift, AltTab

Reaktiviert den WIN+C-Hotkey.

Hotkey, #c, On

Deaktiviert den UMSCHALT+WIN+C-Hotkey.

Hotkey, $+#c, Off

Erlaubt 5 Threads für einen Hotkey.

Hotkey, ^!a, , T5

Erstellt einen STRG+ALT+C-Hotkey, der nur in Notepad funktioniert.

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MeinLabelFürNotepad

Erstellt eine GUI, mit der primitive Drei-Tasten-Kombinations-Hotkeys registriert werden können.

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