Erstellt, bearbeitet, 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
Name der Taste zum Aktivieren des Hotkeys, einschließlich Modifikatorzeichen. Zum Beispiel wäre #c
der Hotkey Win+C.
Wenn TasteName bereits als Hotkey existiert, wird dieser Hotkey mit den anderen Parameterwerten des Befehls aktualisiert.
TasteName kann auch der Name eines vorhandenen Hotkey-Labels sein (z. B. ein Zweifach-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, ist TasteName nicht Groß-/Kleinschreibung-sensitiv. 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.
Jeder neu erstellte Hotkey -- entweder via Hotkey-Befehl oder Zweifach-Doppelpunkt-Label -- erhält einen fest zugewiesenen Namen, der eine Zeichenkette bestehend aus seinem Tastennamen und der Reihenfolge seiner Modifikatorsymbolen ist und mit A_ThisHotkey abgerufen werden kann. Dieser Name wird von allen Varianten des Hotkeys verwendet, 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 TasteName 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.
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, aber wenn das Skript mehrere Labels mit demselben Namen enthält, kann nur das erste verwendet werden. Jegliche Doppelpunkte am Ende müssen weggelassen werden. Wenn das Label dynamisch ist (z. B. %VarMitLabelName%), könnte man davor IsLabel(VarMitLabelName) 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 eine einzelne Variablenreferenz mit einem Funktionsobjekt. Zum Beispiel 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 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. Diese Vorgehensweise ist sinnvoll, wenn man nur die Optionen des Hotkeys ändern will.
Hinweis: Wenn das Label oder die Funktion angegeben ist, und wurde der Hotkey durch diesen Befehl zuvor deaktiviert, 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: 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 empfohlen, diese Werte nicht als Labelnamen zu verwenden.
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 Warndialogfenster überspringen, ErrorLevel auf einen der Codes aus der unteren Tabelle setzen und dann den aktuellen Thread fortsetzen.
On: Aktiviert den Hotkey, wenn er aktuell deaktiviert ist.
Off: Deaktiviert den Hotkey, wenn er aktuell aktiviert ist. Diese Option ist normalerweise dafür gedacht, einen Hotkey im deaktivierten Zustand zu erstellen.
B oder B0: Geben Sie den Buchstaben B an, um den Hotkey wie in #MaxThreadBuffer beschrieben zu puffern. Geben Sie B0 (B mit der Nummer 0) an, um diese Art der Pufferung zu deaktivieren.
Pn: Geben Sie den Buchstaben P an und fügen Sie direkt danach die Thread-Priorität des Hotkeys ein. Lässt man die P-Option beim Erstellen eines Hotkeys weg, wird eine Priorität von 0 verwendet.
Tn: Geben Sie den Buchstaben T an und fügen Sie direkt danach die Anzahl der Threads ein, die dieser Hotkey wie in #MaxThreadsPerHotkey beschrieben maximal haben darf. Zum Beispiel: T5
.
In (InputLevel) [v1.1.23+]: Geben Sie den Buchstaben I (oder i) an und fügen Sie direkt danach die Eingabestufe des Hotkeys ein. Zum Beispiel: I1
.
Wenn einer der Optionsbuchstaben weggelassen wird und der Hotkey bereits existiert, werden diese Optionen nicht geä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.
Diese Unterbefehle machen alle danach erstellten Hotkeys kontextabhängig. Siehe unten für weitere Details.
Innerhalb dieser Parameter wird jede Variablenreferenz wie %var% nach Abschluss des Befehls dauerhaft wirksam. Mit anderen Worten: Spätere Änderungen am Inhalt der Variablen werden von bestehenden IfWin-Hotkeys nicht berücksichtigt.
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.
[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 Sie ihm gegeben haben, 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.
[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). 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.
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.
[v1.1.04+]: Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Weitere Informationen finden Sie unter 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 Speicherreservierung fehlschlägt. ErrorLevel wird in solchen Fällen nicht gesetzt, aber wäre bei Erfolg immer noch 0.
Error | Beschreibung |
---|---|
1 | Der Label-Parameter verweist auf einen nicht-existierenden Labelnamen. |
2 | Der TasteName-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 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 versucht, einen nicht-existierenden Hotkey zu ändern. |
6 | Der Befehl versucht, eine nicht-existierende Variante eines vorhandenen Hotkeys zu ändern. Um dieses Problem zu lösen, können Sie Hotkey IfWin nutzen, um die Kriterien so einzustellen, dass sie mit denen des zu ändernden Hotkeys übereinstimmen. |
98 | Dieser Hotkey würde das Hotkey-Limit pro Skript überschreiten (allerdings darf 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. 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.
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 dem 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 Leistung 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 bestimmtes Label kann das Ziel von mehreren Hotkeys sein. Wenn bekannt ist, dass ein Label durch einen Hotkey aufgerufen wurde, können Sie mit der interne Variable A_ThisHotkey überprüfen, welcher Hotkey das war.
Wenn das Skript suspendiert ist, werden neu hinzugefügte/aktivierte Hotkeys 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.
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 terminieren zu können. Hotkey-Skripte sind zudem automatisch #SingleInstance (einzeln vorkommend), sofern nicht #SingleInstance, Off
verwendet wurde.
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 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), geben Sie einen beliebigen If-Unterbefehl an und lassen Sie alle Parameter weg. Zum Beispiel: Hotkey, If
oder Hotkey, IfWinActive
.
Sollte "Hotkey If" nie im Skript verwendet werden, wird die unterste im Skript angegebene #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.
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
. Die Schreibweise der Tasten muss jedoch konsistent sein. Esc beispielsweise ist in diesem Zusammenhang nicht das gleiche wie Escape (die Groß- und Kleinschreibung hingegen ist 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.
Hotkey-Symbole, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer
Erstellt einen STRG+ALT+Z-Hotkey.
Hotkey, ^!z, MeinLabel return MeinLabel: MsgBox Sie haben %A_ThisHotkey% gedrückt. return
Erstellt einen STRG+ALT+C-Hotkey, der nur im Texteditor 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