Hotkeys (Maus, Joystick und Tastatur-Shortcuts)


Tabelle der Inhalte

Einführung und einfache Beispiele

Hotkeys werden manchmal auch als Shortcut-Tasten bezeichnet, da sie die Fähigkeit haben eine Aktion einfach und schnell auszulösen (wie das Starten eines Programmes oder eines Tastatur-Makros). Im folgenden Beispiel wird der Hotkey Win+N so konfiguriert, dass er das Notepad startet. Das Hash-Zeichen (#) steht für die Windows-Taste, welche auch als Modifier bezeichnet wird:

#n::
Run Notepad
return

Oben in der letzten Zeile schließt "return" den Hotkey ab. Dies wird immer benötigt, außer das Kürzel kann in einer Zeile geschrieben werden. Dann kann der Befehl direkt nach den doppelten Doppelpunkten geschrieben werden, das "return" ist hier implizit:

#n::Run Notepad

Um mehr als eine Modifier-Taste (wie Strg oder Alt) zu benutzen schreibe sie einfach hintereinander (die Reihenfolge spielt keine Rolle). Das folgende Beispiel nutzt ^!, was Strg+Alt entspricht:

^!s::
Send Sincerely,{enter}John Smith ; Diese Zeile sendet Tasten an das aktive Fenster.
return

Folgende Modifier-Zeichen können verwendet werden um Hotkeys (Tastenkürzel) anzulegen:

Symbol Description
# Win (Windows-Taste)
! Alt
^ Strg
+ Shift
& Das Und-Zeichen kann zwischen 2 Tasten oder Maustasten verwendet werden, um sie zu einem eigenen Tastenkürzel zu kombinieren. Siehe unten für Details. Diese Tastenkürzel werden unter Windows 95/98/Me ignoriert.
< Hiermit wird nur die linke Taste eines Paares verwendet z.B.: <!a ist das Gleiche wie !a, außer dass es nur mit der linken Alt-Taste ausgelöst wird. Dieses Steuerzeichen wird unter 95/98/ME ignoriert.
> Hiermit wird nur die rechte Taste eines Paares verwendet. Dieses Steuerzeichen wird unter 95/98/ME ignoriert.
<^>!

AltGr (alternate graving). Wenn dein Tastatur-Layout eine AltGr-Taste anstatt einer rechten Alt-Taste verwendet, wird links stehende Serie von Buchstaben benützt um AltGR anzuzeigen (benötigt Windows NT/2k/XP oder später). Zum Beispiel:

<^>!m::MsgBox Sie haben AltGr+m gedrückt.
<^<!m::MsgBox Sie haben LeftControl+LeftAlt+m gedrückt.

Alternativ, um AltGr selbst zu einem Tastenkürzel zu machen verwende folgenden Hotkey (ohne ein Kürzel wie vorangegangen im Skript zu haben!):

LControl & RAlt::MsgBox Sie haben AltGr gedrückt.
*

Platzhalter: Löst das Tastenkürzel auch aus, wenn weitere Modifier gedrückt sind. Dies findet häufige Verwendung beim Neubelegen einer Taste. Zum Beispiel:

*#c::Run Calc.exe ; Win+C, Shift+Win+C, Strg+Win+C, usw. lösen alle das Kürzel aus
*ScrollLock::Run Notepad ; Jeder Druck auf Scrolllock löst das Kürzel aus, auch wenn Modifier-Tasten gedrückt sind

Dieses Steuerzeichen wird unter 95/98/ME ignoriert.

~

Wird das Tastenkürzel ausgelöst wird seine normale Funktion nicht blockiert - er führt seine Aktion ganz normal zusätzlich aus. In beiden Beispielen unten wird die recht Maustaste an das aktive Fenster gesendet:

~RButton::MsgBox Sie haben die rechte Maustaste gedrückt.
~RButton & C::MsgBox Sie haben C gedrückt, während sie die rechte Maustaste gedrückt gehalten haben.

Hinweise: 1) Im Gegensatz zu anderen Steuerzeichen ist die Tilde nicht zwingend für alle Tastenkürzel-Varianten - sie darf in manchen fehlen; 2) Tastenkürzel die Alt-Tab ersetzen ignorieren die Tilde immer; 3) Das Steuerzeichen wird unter Windows 95/98/ME ignoriert.

$

Dieses Zeichen wird üblicherweise nur benötigt, wenn das Skript den Send-Befehl verwendet um die Tasten zu senden, die das Tastenkürzel selbst auslösen würden. Das exakte Verhalten von $ ist vom Betriebssystem abhängig:

Unter Windows NT4/2k/XP oder später: Das $ Prefix zwingt den Keyboard-Hook um das Tastenkürzel zu aktivieren, was als Nebeneffekt verhindert, dass es durch den Send-Befehl ausgelöst wird. Es bewirkt also das Selbe wie eine Definition von #UseHook irgendwo oberhalb des Hotkeys.

Unter Windows 95/98/Me: Das Tastenkürzel wird während der Ausführung seines Threads ausgeschalten und anschließend wieder reaktiviert. Als Nebeneffekt wird für #MaxThreadsPerHotkey ein Wert größer 1 für diese Tastenkürzel ignoriert (wird hier immer wie 1 behandelt).

UP

Das Wort UP kann auf den Namen der Kürzels folgen um zu erreichen, dass die Aktion erst beim Loslassen ausgeführt wird. Das folgende Beispiel legt die linke Strg-Taste auf die linke Windows-Taste: 

*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

"Up" kann auch mit ganz normalen Tastenkürzeln verwendet werden wie in diesem Beispiel: ^!r Up::MsgBox Sie haben Ctrl+Alt+R gedrückt und wieder losgelassen. Es funktioniert auch mit kombinierten Kürzel (z.B.: F1 & e Up::)

Limitierungen: 1) "Up" funktioniert nicht mit Joystick-Buttons; 2) "Up" benötigt Windows NT4/2000/XP oder später; und 3) Ein "Up"-Hotkey ohne sein normales (Down) Gegenstück übernimmt die Tasten komplett um zu verhindern, dass er "stecken" bleibt. Ein Weg dies zu verhindern ist das Hinzufügen des Tilde-Prefix (z.B.: ~LControl up::)

Kleiner Hinweis hierzu: Eine Technik um unerwünschtes Auslösen zu verhindern ist es eine Taste selbst zur Prefix-Taste zu machen. Der Vorteil liegt darin, dass der Hotkey nur dann ausgelöst wird, wenn ansonsten keine andere Taste gedrückt wird. Zum Beispiel:

LControl & F1::return ; Macht die linke Strg-Taste zu einer Prefix-Taste, da diese vor dem "&" verwendet wird.
LControl::MsgBox Sie haben die linke Strg-Taste losgelassen ohne sie zum Modifizieren einer anderen Taste verwendet zu haben.

(Siehe die Tastenliste für eine komplette Liste der Tasten und Maus/Joystick-Knöpfe)


Mehrere Tastenkürzel können übereinander geschrieben werden um die selbe Aktion auszuführen. Zum Beispiel:

^Numpad0::
^Numpad1::
MsgBox Sowohl Strg+Numpad0 als auch Strg+Numpad1 wird diese Nachricht anzeigen.
return

Eine Taste oder eine Tastenkombination kann auch komplett ausgeschalten werden, indem sie einfach nichts tut. Das folgende Beispiel deaktiviert die rechte Windows-Taste:

RWin::return

Kontext-abhängige Tastenkürzel [v1.0.41+]

Die Direktive #IfWinActive/Exist kann benutzt werden um ein Tastenkürzel verschiedene Aktionen ausführen zu lassen (oder eben keine), in Abhängigkeit von der Existenz eines Fensters oder auch ob es aktiv ist. Zum Beispiel:

#IfWinActive, ahk_class Notepad
^a::MsgBox Sie haben Strg-A gedrückt während Notepad aktiv ist. Wird Strg-A in einem anderen Fenster gedrückt wird die Tastenkombination unverändert an das Fenster gesendet.
#c::MsgBox Sie haben Win-C gedrückt während Notepad aktiv ist.
#IfWinActive
#c::MsgBox Sie haben Win-C gedrückt, währen ein beliebiges Fenster außer Notepad aktiv ist.

Eigene Kombinationen und andere Features [Windows NT/2000/XP oder später]

Sie können eigene Kombination zweier Tasten erstellen (außer Joystick-Tasten) indem Sie " & " zwischen diesen verwenden. Im Beispiel unten müssen sie Numpad0 gedrückt halten und können mit Numpad1 oder Numpad2 eine Aktion auslösen:

Numpad0 & Numpad1::MsgBox Sie haben Numpad1 gedrückt während Sie Numpad0 gedrückt gehalten haben.
Numpad0 & Numpad2::Run Notepad

Im Beispiel oben ist Numpad0 eine Prefix-Taste; dadurch verliert Numpad0 allerdings auch seine normale Funktion, wenn sie alleine gedrückt wird. Um dies zu umgehen ist es nötig eine Aktion für die Taste selbst zu definieren. Zum Beispiel:

Numpad0::WinMaximize A ; Maximiert das aktive Fenster
Numpad0::Send {Numpad0} ; Beim Loslassen von Numpad0 wird ein Numpad0-Tastenanschlag gesendet. Siehe den Kommentar oben.

Anmerkung: Die Gegenwart eines der beiden Tastenkürzel des ersten Beispiels bewirkt, dass das Loslassen von Numpad0 die angegebene Aktion ausführt, allerdings nur, wenn keine weiteren Tasten gedrückt wurden.

Numlock, Capslock, und Scrolllock: Diese Tasten können auch in den Status "AlwaysOn" oder "AlwaysOff" geschickt werden. Zum Beispiel: SetNumlockState AlwaysOn

Überschreiben der Explorer-Kürzel: Windows' eingebaute Tastenkürzel wie Win-E (#e) oder Win-R (#r) können einzeln überschrieben werden indem man einfach eine neue Aktion zuweist. Siehe dazu Kürzel überschreiben für weitere Details.

Ersatz für Alt-Tab: Tastenkürzel können eine alternative Möglichkeit für Alt-Tab zur Verfügung stellen. Zum Beispiel erlauben folgende 2 Tastenkürzel Alt-Tab auch mit der rechten Hand:

RControl & RShift::AltTab ; Halte die rechte Strg-Taste gedrückt und dann drücke Shift (auch wiederholt) um dich vorwärts durch das Menü zu bewegen.
RControl & Enter::ShiftAltTab ; Ohne die rechte Strg-Taste loszulassen kann auch Enter gedrückt werden um in die entgegen gesetzte Richtung zu navigieren.

Für weitere Informationen siehe Alt-Tab.

Mausradkürzel [Windows NT/2000/XP oder später]

Die Unterstützung von Tastenkürzeln, die mit dem Mausrad ausgelöst werden ist mit den Namen WheelDown und WheelUp gegeben. Zum Beispiel:

MButton & WheelDown::MsgBox Sie haben das Mausrad nach unten gedreht, während die mittlere Maustaste gedrückt war.
^!WheelUp::MsgBox Sie haben das Mausrad nach oben gedreht, während sie Strg-Alt gedrückt haben.

In v1.0.43.03+ enthält die interne Variable A_EventInfo die Nummer der Schritte, die das Rad gedreht wurde, was immer mindestens 1 ist. Integer-Zahlen höher als 1 treten üblicherweise auf, wenn das Rad schnell gedreht wurde (wie häufig dies auftritt hängt auch von der Feinheit der Maus-Hardware ab). Verwendungsbeispiel: ~WheelDown::ToolTip %A_EventInfo%

Einige der nützlichsten Tastenkombinationen für das Mausrad beinhalten alternative Scroll-Möglichkeiten für Text. Zum Beispiel scrollt das folgende Kürzelpaar horizontal statt vertikal, wenn die Strg-Taste gedrückt wird.

~LControl & WheelUp:: ; Scrollen nach links.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- Erhöhe diesen Wert um schneller zu scrollen.
SendMessage, 0x114, 0, 0, %fcontrol%, A ; 0x114 ist WM_HSCROLL und die 0 danach ist SB_LINERIGHT.
return
~LControl & WheelDown:: ; Scrollen nach rechts.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- Erhöhe diesen Wert um schneller zu scrollen.
SendMessage, 0x114, 1, 0, %fcontrol%, A ; 0x114 ist WM_HSCROLL und die 1 danach ist SB_LINELEFT.
return

Abschließend sei angemerkt, dass das Mausrad nur Down-Events generiert (nie Up-Events). Folglich können sie nie als Key-up Kürzel verwendet werden.

Tastenkürzel-Tipps und Hinweise

Jede Numpad-Taste kann 2 verschiedene Hotkey-Routinen ausführen, abhängig vom Numlock-Status. Aber auch die Numlock-unabhängige Variante ist möglich. Zum Beispiel:

NumpadEnd::
Numpad1::
MsgBox, Dieses Kürzel wird unabhängig vom Numlock-Status ausgeführt.
return

Wird das Tilde-Prefix (~) in einem Prefix Kürzel auch nur einmal verwendet wird dieses bei allen Prefix-Keys an das aktive Fenster gesendet. Zum Beispiel werden bei beiden Kürzel unten alle Rechtsklicks an das aktive Fenster gesendet, obwohl nur eines die Tilde enthält:

 ~RButton & LButton::MsgBox Sie haben die linke Maustaste gedrückt, während die rechte gedrückt gehalten wurde.
RButton & WheelUp::MsgBox Sie haben das Mausrad nach oben gedreht, während die rechte Maustaste gedrückt gehalten wurde.

Das Kommando Suspend kann zeitweilig alle Kürzel deaktivieren für die keine Ausnahme definiert wurde. Für eine größere Selektivität verwende #IfWinActive/Exist.

Mit dem Hotkey-Kommando können Tastenkürzel auch dynamisch erzeugt werden während das Script ausgeführt wird. Damit können auch einzelne Kürzel geändert, ausgeschalten oder aktiviert werden.

Joystick-Kürzel unterstützen im Moment keine Prefix-Keys wie ^ (Strg) and # (Win). Sie können allerdings GetKeyState verwenden um den Effekt zu imitieren:

Joy2::
if not GetKeyState("Control") ; Wenn weder die linke noch die rechte Strg-Taste gedrückt sind
return ; tue z.B.: nichts
MsgBox Sie haben den zweiten Knopf des ersten Joysticks gedrückt, während die Strg-Taste gedrückt war.
return

Es gibt Situationen wo ein Tastenkürzel mit seiner Ausführung solange warten soll bis die Modifier-Tasten losgelassen wurden. Beachten Sie folgendes Beispiel:

^!s::Send {Delete}

Das Drücken von Strg-Alt-S würde vom System so interpretiert, als ob Strg-Alt-Entf gedrückt worden wäre (durch die äußerst hartnäckige Erkennung von Strg-Alt-Entf durch das Betriebssystem). Um dies zu umgehen kann KeyWait verwendet werden um die Ausführung bis zum Loslassen zu verzögern:

^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

Ein Tastenkürzel kann auch als Sprungmarke (Label) für Gosub oder Goto verwendet werden. Zum Beispiel: Gosub ^!s

Eine häufige Verwendung für Tastenkürzel ist es eine wiederholende Aktion zu starten oder zu stoppen, wie eine Serie von Tastenanschlägen oder Mausklicks. Für ein Beispiel siehe dieses FAQ-Thema.

Abschließend gesagt ist jedes Skript Quasi-Multi-Threaded, was es erlaubt, dass ein neues Tastenkürzel ausgelöst wird während eine vorherige Routine noch läuft. Es ist also möglich Tastenkürzel zu verwenden während zum Beispiel noch eine MsgBox angezeigt wird.

Alt-Tab-Kürzel

Jedes Alt-Tab-Kürzel muss eine Kombination aus 2 Tasten sein, wozu üblicherweise das Und-Zeichen (&) verwendet wird. Im folgenden Beispiel wird die rechte Alt-Taste gedrückt und mit J und K im Alt-Tab-Menü navigiert:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab und ShiftAltTab sind 2 von mehreren speziellen Befehlen, die nur erkannt werden, wenn sie in der selben Zeile wie das Kürzel selbst verwendet werden. Hier ist die vollständige Liste:

AltTab: Ist das Alt-Tab-Menü sichtbar bewege dich darin vorwärts, andernfalls zeige das Menü an (nur wenn das Kürzel eine "&"-Kombination von 2 Tasten ist, andernfalls tue nichts).

ShiftAltTab: Das gleiche wie oben, nur rückwärts im Menü.

AltTabAndMenu: Wenn das Menü sichtbar ist bewege dich darin vorwärts, andernfalls zeige das Menü an.

AltTabMenuDismiss: Schließe das Alt-Tab-Menü.

Um obiges zu veranschaulichen kann das Mausrad als vollständiger Ersatz von Alt-Tab dienen. Mit folgendes Hotkeys bewirkt der Druck auf die mittlere Maustaste das Anzeigen des Menüs und das Drehen des Mausrades die Navigation in diesem:

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

Um ein Alt-Tab-Menü abzubrechen ohne ein Fenster zu aktivieren kann ein Tastenkürzel verwendet werden wie in unten stehendem Beispiel. Es können Anpassungen nötig sein, abhängig von: 1) wie das Alt-Tab-Menü aufgerufen wurde; und 2) ob das Skript den Keyboard-Hook installiert hat.

LCtrl & CapsLock::AltTab
!MButton:: ; Mittlere Maustaste. Das !-Prefix zeigt an, dass es mit gedrückter Alt-Taste ausgelöst wird (was der Fall ist, wenn das AltTab-Menü angezeigt wird).
IfWinExist ahk_class #32771 ; Zeigt an, dass das Alt-Tab-Menü auf dem Bildschirm angezeigt wird.
Send !{Escape}{Alt up}
return

Aktuell müssen alle speziellen Alt-Tab-Aktionen direkt einem Tastenkürzel zugewiesen werden wie in den vorangegangenen Beispielen (sie können also nicht wie andere Befehle verwendet werden). Die Anwesenheit des Alt-Tab-Menüs kann mit IfWinExist ahk_class #32771 überprüft werden.

Alt-Tab-Aktionen können aber auch mit normalen Tastenkürzeln geschaffen werden. Im folgenden Beispiel wird F1 verwendet um das Menü anzuzeigen und zum Vorwärts-Navigieren. Mit F2 wird das aktuell angewählte Fenster aktiviert (oder mit Escape abgebrochen):

*F1::Send {Alt down}{tab} ; Das Sternchen (Asterisk) wird in diesem Fall benötigt.
!F2::Send {Alt up} ; Die Alt-Taste wird losgelassen, was zur Aktivierung des gewählten Fensters führt.
~*Escape::
IfWinExist ahk_class #32771
Send {Escape}{Alt up} ; Schließe das Menü ohne Aktivierung
return