Neubelegung von Tasten

Einführung

Einschränkung: Das unten beschriebene Neubelegungs-Feature von AutoHotkey ist in der Regel nicht so eindeutig und effektiv wie das direkte Neubelegen mit der Windows-Registry. Die Vor- und Nachteile der einzelnen Methoden findest du unter Neubelegung mit der Registry.

Neubelegung von Tastatur und Maus

Die Syntax zum Neubelegen einer Taste ist Originaltaste::Zieltaste. Enthält ein Skript beispielsweise nur die folgende Zeile, würde sie die A-Taste dazu bringen, sich wie die B-Taste zu verhalten:

a::b

Im oberen Beispiel wird die B-Taste selbst nicht geändert. Die B-Taste würde weiterhin ein "b" senden, sofern du sie auch nicht neubelegst, wie z. B.:

a::b
b::a

Es reicht vollkommen aus, bei den meisten Neubelegungen Kleinbuchstaben zu verwenden, weil deren Großbuchstaben auch mit neubelegt werden (das heißt: Drückt man die neubelegte Taste bei aktivierter FESTSTELL-Taste oder beim Drücken der UMSCHALT-Taste, würde automatisch ein Großbuchstabe gesendet werden). Ein Großbuchstabe als Zieltaste würde hingegen die Großschreibung erzwingen. Das folgende Beispiel würde ein großgeschriebenes B erzeugen, wenn du entweder "a" oder "A" eingibst (sofern die FESTSTELL-Taste deaktiviert ist):

a::B

 

Neubelegung der Maus: Mit der gleichen Methode kann auch die Maus neubelegt werden. Zum Beispiel:

MButton::Shift Bringt die mittlere Maustaste dazu, sich wie die UMSCHALT-Taste zu verhalten.
XButton1::LButton Bringt die vierte Maustaste dazu, sich wie die linke Maustaste zu verhalten.
RAlt::RButton Bringt die rechte ALT-Taste dazu, sich wie die rechte Maustaste zu verhalten.

 

Weitere nützliche Neubelegungen:

Capslock::Ctrl Bringt die FESTSTELL-Taste dazu, sich wie die STRG-Taste zu verhalten. Um die FESTSTELL-Taste weiterhin an- oder ausschalten zu können, musst du +Capslock::Capslock davor setzen. Diese Neubelegung würde die FESTSTELL-Taste an- oder ausschalten, wenn du die UMSCHALT-Taste gedrückt hältttst und die FESTSTELL-Taste drückst. Da bei beiden Neubelegungen zusätzliche Modifikatortasten gedrückt gehalten werden können, muss die spezifischere Neubelegung +Capslock::Capslock an erster Stelle gesetzt werden, bevor es funktionieren kann.
XButton2::^LButton Bringt die fünfte Maustaste (XButton2) dazu, STRG+MAUSTASTE-LINKS zu erzeugen.
RAlt::AppsKey Bringt die rechte ALT-Taste dazu, sich wie die MENÜ-Taste zu verhalten (das ist die Taste zum Öffnen des Kontextmenüs).
RCtrl::RWin Bringt die rechte STRG-Taste dazu, sich wie die rechte WIN-Taste zu verhalten.
Ctrl::Alt Bringt die STRG-Taste dazu, sich wie die ALT-Taste zu verhalten. Siehe jedoch Alt-Tab-Probleme.
^x::^c Bringt STRG+X dazu, STRG+C zu erzeugen. Sie würde auch STRG+ALT+X dazu bringen, STRG+ALT+C zu erzeugen, usw.
RWin::Return Bringt die rechte WIN-Taste dazu, nichts zu tun (siehe Return).

Du kannst die hier genannten Beispiele ausprobieren, indem du sie in eine neue Textdatei (z. B. "Remap.ahk") kopierst und anschließend startest.

In der Tastenliste findest du alle möglichen Namen der Tastatur- und Maustasten.

Bemerkungen

Mit den Direktiven #IfWinActive/Exist können Neubelegungen bestimmt werden, die nur für das angegebene Fenster gültig sein sollen. Zum Beispiel:

#IfWinActive ahk_class Notepad
a::b  ; Bringt 'a' dazu, sich im Texteditor wie 'b' zu verhalten.
#IfWinActive  ; Macht nachfolgende Neubelegungen und Hotkeys für alle Fenster geltend.

Das Neubelegen einer Taste wird bei folgenden Punkten als "vollständig" angesehen:

Eine neubelegte Taste kann normale Hotkeys auslösen, aber standardmäßig keine Maus- oder Hook-Hotkeys (mit ListHotkeys kannst du rausfinden, welche Hotkeys das Hook-Feature haben). Bei dem Beispiel a::b würde durch Drücken von STRG+ALT+A der Hotkey ^!b ausgelöst werden, sofern ^!b kein Hook-Hotkey ist. Wenn ^!b ein Hook-Hotkey ist, kannst du ^!a als Hotkey definieren, wenn STRG+ALT+A die gleiche Aktion ausführen soll wie STRG+ALT+B. Zum Beispiel:

a::b
^!a::
^!b::
ToolTip Du hast %A_ThisHotkey% gedrückt.
return

Seit v1.1.06 kann #InputLevel als alternativer Weg verwendet werden, um das Standardverhalten zu überschreiben. Zum Beispiel:

#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip Du hast %A_ThisHotkey% gedrückt.
return

Ein SendMode im automatischen Ausführungsbereich (oberster Bereich des Skripts) beeinflusst alle Neubelegungen. Da beim Neubelegen Send {Blind} gilt und der SendPlay-Modus {Blind} nicht richtig unterstützt, kann es passieren, dass einige Neubelegungen nicht korrekt im SendPlay-Modus laufen (besonders STRG, UMSCHALT, ALT und WIN). Um dies zu umgehen, solltest du im automatischen Ausführungsbereich auf SendPlay verzichten, wenn Neubelegungen vorhanden sind; verwende stattdessen im ganzen Skript den Befehl SendPlay anstelle von Send. Alternativ könntest du die Neubelegungen in Hotkeys umwandeln (wie unten beschrieben), der explizit SendEvent anstelle von Send aufruft.

Beim Starten eines Skripts wird jede Neubelegung in ein Hotkey-Paar umgewandelt. Zum Beispiel würde ein Skript, das a::b enthält, eigentlich folgende zwei Hotkeys enthalten:

*a::
SetKeyDelay -1   ; Ist die Zieltaste eine Maustaste, dann stattdessen SetMouseDelay.
Send {Blind}{b DownTemp}  ; DownTemp ist wie Down, außer dass andere Send-Befehle im Skript nicht davon ausgehen, dass "b" beim Senden unten bleiben soll.
return

*a up::
SetKeyDelay -1  ; Siehe den Hinweis unten, warum die Druckdauer bei beiden SetKeyDelays fehlt.
Send {Blind}{b Up}
return

Allerdings unterscheiden sich die obigen Hotkeys unter folgenden Umständen:

  1. Wenn die Originaltaste LCtrl und die Zieltaste eine ALT-Taste ist, wird die Zeile Send {Blind}{LAlt DownTemp} durch Send {Blind}{LCtrl Up}{LAlt DownTemp} ersetzt. Das Gleiche gilt, wenn die Originaltaste RCtrl ist, aber dann stattdessen {RCtrl up}.
  2. Wenn eine Tastatur-Taste dazu gebracht wird, eine Maustaste zu sein (z. B. RCtrl::RButton), verwenden die obigen Hotkeys SetMouseDelay statt SetKeyDelay. Darüber hinaus wird der erste Hotkey oben mit dem folgenden Hotkey ersetzt, um das Auto-Wiederholungs-Feature der Tastatur daran zu hindern, wiederholende Mausklicks zu generieren:
    *RCtrl::
    SetMouseDelay -1
    if not GetKeyState("RButton")  ; wenn die rechte Maustaste noch nicht unten ist ...
        Send {Blind}{RButton DownTemp}
    return

Beachte, dass SetKeyDelay's zweiter Parameter (Druckdauer) bei den Hotkeys oben fehlt. Das liegt daran, dass die Druckdauer nicht auf Nur-Unten- oder Nur-Oben-Ereignisse angewendet wird, wie z. B. {b down} und {b up}. Allerdings wird sie auf Änderungen in Bezug auf den Zustand der Tasten UMSCHALT, STRG, ALT und WIN angewendet, das Neubelegungen wie a::B oder a::^b beeinflusst. Folglich würde jede Druckdauer, die im automatischen Ausführungsbereich in Kraft gesetzt wird, für alle Neubelegungen gelten.

Ein Tastenpaar kann nicht direkt zu einer einzigen Taste neubelegt werden (z. B. ist a & c::b keine gültige Schreibweise). Allerdings ist es möglich, diesen Effekt nachzuahmen, indem man die Up- und Down-Hotkeys von ganz oben stattdessen verwendet: ersetze *a:: mit a & c::, und *a up:: mit a & c up::.

Da Neubelegungen in Hotkeys umgewandelt werden, wie oben beschrieben, können sie vom Suspend-Befehl beeinflusst werden. Ebenso könnte der Hotkey-Befehl eine Neubelegung deaktivieren oder ändern. Zum Beispiel würden die zwei folgenden Befehle die Neubelegung a::b deaktivieren.

Hotkey, *a, off
Hotkey, *a up, off

Alt-Tab-Probleme: Wenn du eine Taste oder Maustaste zu einer ALT-Taste neubelegt hast, wird diese Taste wahrscheinlich nicht in der Lage sein, ein Alt-Tab richtig durchzuführen. Eine mögliche Übergangslösung ist es, den Hotkey *Tab::Send {Blind}{Tab} einzufügen. Aber beachte, dass dieser Hotkey Probleme verursachen kann, wenn die echte ALT-Taste zum Alt-Tabbing verwendet wird. Er sollte daher nur verwendet werden, wenn du ausschließlich mit neubelegten Tasten und/oder Alt-Tab-Hotkeys Alt-Tabbing durchführst.

Zusätzlich zu den Tasten und Maustasten in der Tastenliste kann die Originaltaste auch eine virtuelle Taste (VKnn) oder ein Scancode (SCnnn) sein (siehe Sondertasten). Das gleiche gilt für die Zieltaste, außer dass nach der virtuellen Taste optional auch ein Scancode angegeben werden kann. Bei den meisten Tastaturbelegungen wäre beispielsweise sc01e::vk42sc030 das gleiche wie a::b.

Wenn eine Taste deaktiviert statt neubelegt werden soll, muss sie zu einem Hotkey gemacht werden, das einfach nur ein Return hat. Zum Beispiel würde F1::Return die F1-Taste deaktivieren.

Folgende Tasten werden nicht von der Built-in-Neubelegungsmethode unterstützt:

Bewegung des Mauszeigers per Tastatur

Im vollausgestatteten Tastatur-zu-Maus-Skript wird gezeigt, wie der Mauszeiger mit der Tastatur bewegt werden kann. Da dieses Skript eine reibungslose Mausbewegung, -beschleunigung und andere Features bietet, solltest du es verwenden, wenn du vorhast, die Mausaktivitäten häufig mit der Tastatur durchzuführen. Das folgende Beispiel ist eine vereinfachte Version davon:

*#up::MouseMove, 0, -10, 0, R  ; WIN + NACH-OBEN => Zeiger nach oben bewegen
*#Down::MouseMove, 0, 10, 0, R  ; WIN + NACH-UNTEN => Zeiger nach unten bewegen
*#Left::MouseMove, -10, 0, 0, R  ; WIN + NACH-LINKS => Zeiger nach links bewegen
*#Right::MouseMove, 10, 0, 0, R  ; WIN + NACH-RECHTS => Zeiger nach rechts bewegen

*<#RCtrl::  ; WIN-LINKS + STRG-RECHTS => Linker Mausklick (halte STRG/UMSCHALT gedrückt, um ein STRG+Klick oder UMSCHALT+Klick zu machen).
SendEvent {Blind}{LButton down}
KeyWait RCtrl  ; Hindert die Tastatur-Auto-Wiederholung daran, den Mausklick zu wiederholen.
SendEvent {Blind}{LButton up}
return

*<#AppsKey::  ; WIN-LINKS + MENU => Rechter Mausklick
SendEvent {Blind}{RButton down}
KeyWait AppsKey  ; Hindert die Tastatur-Auto-Wiederholung daran, den Mausklick zu wiederholen.
SendEvent {Blind}{RButton up}
return

Neubelegung via Registry's "Scancode Map"

Vorteile:

Nachteile:

Wie Änderungen an der Registry vorgenommen werden können: Es gibt mindestens zwei Methoden zum Neubelegen von Tasten per Registry:

  1. Mit einem Programm wie KeyTweak (Freeware) kannst du visuell Tasten neubelegen. Dieses Programm ändert automatisch die Registry für dich.
  2. Du kannst Tasten manuell neubelegen, indem du eine .reg-Datei (Klartext) erstellst und sie in die Registry lädst. Siehe dazu www.autohotkey.com/forum/post-56216.html#56216.

Siehe auch

Liste mit Tasten
GetKeyState
Neubelegung eines Joysticks