Hotkey

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

Hotkey TasteName , Aktion, Optionen

Parameter

TasteName

Typ: Zeichenkette

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-Funktion oder Zweifach-Doppelpunkt-Label - wird dieser Hotkey mit den anderen Parameterwerten der Funktion 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-Funktion oder Zweifach-Doppelpunkt-Syntax - erhält einen festen Namen, der sich aus dem Tastennamen und der Reihenfolge der Modifikatorsymbolen zusammensetzt, widergespiegelt durch ThisHotkey. Dieser Name wird von allen Varianten des Hotkeys verwendet, und ändert sich auch dann nicht, wenn die Hotkey-Funktion später mit einer anderen Symbolreihenfolge auf den Hotkey zugreift.

Wenn die Hotkey-Variante bereits existiert, wird ihr Verhalten gemäß der Tatsache aktualisiert, ob TasteName das Tilde-Präfix (~) enthält oder nicht.

Das Hook-Präfix ($) kann auf existierende Hotkeys angewendet werden. Dieses Präfix beeinflusst alle Varianten des Hotkeys und kann nicht entfernt werden.

Aktion

Typ: Funktionsobjekt oder Zeichenkette

Wenn weggelassen und TasteName bereits als Hotkey existiert, bleibt seine Aktion unverändert. Dies ist z.B. nützlich, um nur die Optionen des Hotkeys zu ändern. Andernfalls geben Sie eine Rückruffunktion, den Namen eines Hotkeys ohne führende Doppelpunkte oder einen der unten aufgeführten Sonderwerte an.


Geben Sie eine Funktion an, die beim Drücken des Hotkeys aufgerufen werden soll (als neuer Thread).

Die Rückruffunktion akzeptiert einen Parameter und kann wie folgt definiert werden:

MeinRückruf(HotkeyName) { ...

Es spielt keine Rolle, welchen Namen Sie dem Parameter geben, allerdings wird ihm als Wert der Hotkey-Name zugewiesen.

Der Parameter der Rückruffunktion kann weggelassen werden, wenn die entsprechende Information nicht benötigt wird, aber dann muss ein Sternchen angegeben werden, z.B. MeinRückruf(*).

Hotkeys, die mit der Zweifach-Doppelpunkt-Syntax definiert wurden, verwenden automatisch den Parameternamen ThisHotkey. Es ist auch möglich, Hotkeys einen Funktionsnamen zuzuweisen, ohne die Hotkey-Funktion zu verwenden.

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


Geben Sie den Namen eines Hotkeys an, um seine originale Funktion zu verwenden, also die originale Funktion der Hotkey-Variante gemäß den aktuellen Kriterien von HotIf. Dies wird in der Regel verwendet, um die originale Funktion eines Hotkeys wiederherzustellen, nachdem er geändert wurde, kann aber auch verwendet werden, um die Funktion eines anderen Hotkeys zuzuweisen, vorausgesetzt, dass beide Hotkeys die gleichen HotIf-Kriterien verwenden.


Geben Sie einen der folgenden Sonderwerte an:

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.

Optionen

Typ: Zeichenkette

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

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.

S oder S0: Geben Sie den Buchstaben S an, um den Hotkey vor einer Suspension zu schützen, so dass der Hotkey zum Ausschalten von Suspend verwendet werden kann. Geben Sie S0 (S mit der Zahl 0) an, um den Schutz zu entfernen, so dass der Hotkey wieder suspendiert werden kann.

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): 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 dieser Funktion 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.

Fehlerbehandlung

Es wird eine Ausnahme ausgelöst, wenn ein Parameter ungültig ist oder eine Speicherreservierung fehlschlägt.

Eine der folgenden Ausnahmen wird ausgelöst, wenn der Hotkey ungültig ist oder nicht erstellt werden konnte:

Error-Klasse .Message Beschreibung
ValueError Invalid key name. Der TasteName-Parameter enthält eine oder mehrere Tasten, die entweder nicht erkannt oder von der aktuellen Tastaturbelegung/Sprache nicht unterstützt werden. Exception.Extra enthält den Namen der betroffenen Taste, z.B. "Entre" im Fall von !Entre.
Unsupported prefix key. Zum Beispiel wird die Verwendung des Mausrads als Präfix in einem Hotkey wie WheelDown & Enter nicht unterstützt. Exception.Extra enthält die Präfixtaste.
This AltTab hotkey must have exactly one modifier/prefix. 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. Exception.Extra enthält TasteName.
This AltTab hotkey must specify which key (L or R).
TargetError Nonexistent hotkey. Nicht-existierender Hotkey. Die Funktion versucht, einen nicht-existierenden Hotkey zu ändern. Exception.Extra enthält TasteName.
Nonexistent hotkey variant (IfWin). Nicht-existierende Hotkey-Variante (IfWin). Die Funktion versucht, eine nicht-existierende Variante eines existierenden Hotkeys zu ändern. Um dieses Problem zu lösen, verwenden Sie HotIf, um die Kriterien mit denen des zu ändernden Hotkeys abzustimmen. Exception.Extra enthält TasteName.
Error Max hotkeys. Maximum Hotkeys. Die Erstellung dieses Hotkeys würde die maximale Anzahl von 32762 Hotkeys pro Skript überschreiten (allerdings kann jeder Hotkey unendlich viele Varianten haben; und die Anzahl der Hotstrings ist unbegrenzt).

Tipp: Mit Try-Catch kann geprüft werden, ob eine Hotkey-Variante existiert. Zum Beispiel:

try
    Hotkey "^!p"
catch TargetError
    MsgBox "Der Hotkey existiert nicht oder hat keine Variante mit den aktuellen HotIf-Kriterien."

Bemerkungen

Die aktuelle HotIf-Einstellung bestimmt die Variante eines Hotkeys, mit der die Hotkey-Funktion 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 #HotIf in Verbindung mit WinActive/WinExist (oder das dynamische Äquivalent HotIfWinActive/Exist).

Die Erstellung von Hotkeys via Zweifach-Doppelpunkt-Syntax ist performanter als via Hotkey-Funktion, weil so die Hotkeys beim Start des Skripts gebündelt statt einzeln aktiviert werden können. Daher sollten mit dieser Funktion 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.

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 dieser Funktion je nach Bedarf automatisch installiert oder entfernt.

Obwohl die Hotkey-Funktion nicht in der Lage ist, Hotkeys anderer Skripte direkt zu aktivieren oder zu deaktivieren, kann sie diese 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-Varianten (-Duplikate)

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

HotIfWinActive "ahk_class Notepad"
Hotkey "^!c", MeineFunkFürNotepad
HotIfWinActive "ahk_class WordPadClass"
Hotkey "^!c", MeineFunkFürWordPad
HotIfWinActive
Hotkey "^!c", MeineFunkFürAlleAnderenFenster

Wenn mehr als eine Variante eines Hotkeys zum Auslösen geeignet ist, wird nur die zuerst erstellte Variante ausgelöst. Die Ausnahme davon ist die globale Variante (die Variante ohne HotIf-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 finden Sie unter HotIf und Allgemeine Bemerkungen von #HotIf.

Hotkeys, HotIf, A_ThisHotkey, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, Threads, Thread, Critical, Return, Menu-Objekt, SetTimer, Hotstring-Funktion

Beispiele

Erstellt einen STRG+ALT+Z-Hotkey.

Hotkey "^!z", MeineFunk

MeineFunk(ThisHotkey)
{
    MsgBox "Sie haben " ThisHotkey " gedrückt."
}

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

Hotkey "RCtrl & RShift", "AltTab"

Deaktiviert den UMSCHALT+WIN+C-Hotkey.

Hotkey "$+#c", "Off"

Erlaubt 5 Threads für einen Hotkey.

Hotkey "^!a",, "T5"

Erstellt Alt+W als Hotkey, der nur in Notepad funktioniert.

HotIfWinActive "ahk_class Notepad"
Hotkey "!w", ZeilenumbruchUmschalten  ; !w = Alt+W

ZeilenumbruchUmschalten(ThisHotkey)
{
    MenuSelect "A",, "Format", "Zeilenumbruch"
}

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

HkGui := Gui()
HkGui.Add("Text", "xm", "Präfixtaste:")
HkGui.Add("Edit", "yp x100 w100 vPräfix", "Space")
HkGui.Add("Text", "xm", "Suffix-Hotkey:")
HkGui.Add("Edit", "yp x100 w100 vSuffix", "f & j")
HkGui.Add("Button", "Default", "Registrieren").OnEvent("Click", HotkeyRegistrieren)
HkGui.OnEvent("Close", (*) => ExitApp())
HkGui.OnEvent("Escape", (*) => ExitApp())
HkGui.Show()

HotkeyRegistrieren(*)
{
    Gespeichert := HkGui.Submit(false)
    HotIf (*) => GetKeyState(Gespeichert.Präfix)
    Hotkey Gespeichert.Suffix, (ThisHotkey) => MsgBox(ThisHotkey)
}