キーのリマッピング(キーボード、マウス、コントローラー)

目次

はじめに

制限以下に説明するAutoHotkeyのリマッピング機能は、一般的にWindowsレジストリ経由で直接リマッピングするほど純粋で効果的ではありません。各アプローチの利点と欠点については、レジストリの再マッピングを参照のこと。

キーボードとマウスのリマッピング

組み込みの再マッピング機能の構文はOriginKey::DestinationKeyです。例えば、以下の行だけで構成されるスクリプトは、ABのように動作させる:

a::b

上記の例では、B自体は変更されていない。Bは、次の例のように他のキーにリマップしない限り、"b"キーストロークを送信し続ける:

a::b
b::a

上記の例では小文字を使用しているが、これは対応する大文字もリマップするため、ほとんどの目的には小文字が推奨される(つまり、CapsLockが「オン」またはShiftが押されたままだと大文字が送信される)。対照的に、右側に大文字を指定すると、強制的に大文字になる。例えば、次の行では、"a"または "A"を入力すると、大文字の "B"が表示される(CapsLockがオフの場合):

a::B

逆に、左サイドに含まれていて右サイドに含まれていないモディファイアは、キーが送信されると自動的に解除される。例えば、次の2行は、Shift+AまたはCtrl+Aを押すと小文字の "b"が表示される:

A::b
^a::b

マウスリマッピング

キーボードの代わりにマウスをリマップするには、同じ方法を使います。事例:

説明
MButton::Shift 真ん中のボタンをShiftのように動作させる。
XButton1::LButton マウスの第4ボタンをマウスの左ボタンのように動作させる。
RAlt::RButton Altをマウスの右ボタンのように動作させる。

その他の便利なリマッピング

説明
CapsLock::Ctrl CapsLockCtrlにする。CapsLockのオン/オフ機能を保持するには、まずリマッピング+CapsLock::CapsLockを追加する。Shiftを押しながらCapsLockを押すと、CapsLockのオン/オフが切り替わります。どちらのリマッピングも修飾キーを押したままにできるため、より特殊な+CapsLock::CapsLockリマッピングを最初に配置しなければ動作しない。
XButton2::^LButton マウスの第5ボタン(XButton2)をコントロールクリックする。
RAlt::AppsKey 右のAltMenu(コンテキストメニューを開くキー)にする。
RCtrl::RWin 正しいCtrlが正しいWinになる。
Ctrl::Alt CtrlAltのように動作させる。ただし、alt-tabの問題を参照。
^x::^c Ctrl+XCtrl+Cになる。また、Ctrl+Alt+XCtrl+Alt+Cなどを生成する。
RWin::Return Winは単にリターンさせることで無効にする。

これらの例を "Remap.ahk"のような新しいテキストファイルにコピーし、ファイルを起動することで試すことができる。

キーとマウスボタンの名前の完全なリストは、キーリストを参照してください。

備考

#HotIfディレクティブは、選択したリマッピングを指定したウィンドウでのみ(または指定した条件が満たされている間)有効にするために使用できます。事例:

#HotIf WinActive("ahk_class Notepad")
a::b  ; Makes the 'a' key send a 'b' key, but only in Notepad.
#HotIf  ; This puts subsequent remappings and hotkeys in effect for all windows.

キーやボタンのリマッピングは、以下の点で「完了」となります:

リマップキーは通常のホットキーをトリガーできますが、デフォルトではマウスホットキーやフックホットキーをトリガーすることはできません(どのホットキーが "フック "なのかはListHotkeysを使って調べてください)。例えば、a::bのリマッピングが有効な場合、Ctrl+Alt+Aを押すと、^!bがフックホットキーでない場合のみ^!bホットキーがトリガーされます。^!bがフックホットキーである場合、Ctrl+Alt+ACtrl+Alt+Bと同じ動作をさせたい場合は、^!aをホットキーとして定義できます。事例:

a::b
^!a::
^!b::ToolTip "You pressed " ThisHotkey

Alternatively, #InputLevel can be used to override the default behaviour. 事例:

#InputLevel 1
a::b

#InputLevel 0
^!b::ToolTip "You pressed " ThisHotkey

スクリプト起動時にSendModeが使用されると、すべてのリマッピングに影響する。しかし、リマッピングはSend "{Blind}"を使用し、SendPlayモードは{Blind}を完全にはサポートしていないため、一部のリマッピングはSendPlayモードでは正しく機能しない可能性があります(特にCtrlShiftAltWin)。これを回避するには、リマッピングがある場合は、スクリプトの起動時にSendMode "Play"を使用しないようにします。そして、スクリプト中の他の場所で、関数SendPlay対Sendを使う。あるいは、リマッピングをホットキーに変換し(後述)、SendEvent対Sendを明示的に呼び出すこともできる。

DestinationKey{の場合は、x::`{のようにエスケープしなければならない。そうでない場合は、ホットキーの機能の開始ブレースとして解釈される。

スクリプトが起動すると、各リマッピングはホットキーのペアに変換されます。例えば、a::bを含むスクリプトは、実際には代わりに以下の2つのホットキーを含む:

*a::
{
    SetKeyDelay -1   ; If the destination key is a mouse button, SetMouseDelay is used instead.
    Send "{Blind}{b DownR}"  ; DownR is like Down except that other Send functions in the script won't assume "b" should stay down during their Send.
}

*a up::
{
    SetKeyDelay -1  ; See note below for why press-duration is not specified with either of these SetKeyDelays.
    Send "{Blind}{b Up}"
}

ただし、上記のホットキーは以下の状況で変化する:

  1. 送信元キーが左Ctrl、送信先キーがAltの場合、Send "{Blind}{LAlt DownR}"という行は、Send "{Blind}{LCtrl up}{LAlt DownR}"に置き換えられる。ソースが右Ctrlの場合も、{RCtrl up}が使われる以外は同じである。This is done to ensure that the system translates Alt-key combinations as though Ctrl is not being held down, but it also causes the remapping to override any prior {Ctrl down}. [v2.0.8+]: The unsuppressed Ctrl key-up is still sent for backward-compatibility, but is no longer needed for its original purpose. The side effect can be avoided by replacing the remapping with an explicit pair of hotkeys as demonstrated above.
  2. キーボードのキーがマウスボタンにリマップされる場合(例:RCtrl::RButton)、上記のホットキーはSetKeyDelayの代わりにSetMouseDelayを使用します。さらに、上記の最初のホットキーは以下のように置き換えられ、キーボードのオートリピート機能によるマウスクリックの繰り返しを防ぎます:
    *RCtrl::
    {
        SetMouseDelay -1
        if not GetKeyState("RButton")  ; i.e. the right mouse button isn't down yet.
            Send "{Blind}{RButton DownR}"
    }
  3. ソースがカスタムの組み合わせである場合、ワイルドカード修飾子(*)はホットキーが機能するように省略されます。
  4. If any of the modifier symbols in !#^+ are applied to the source key and not the destination key, they are inserted after the word "Blind" to allow those modifiers to be released by Send. For example, ^a::b would use {Blind^}. <^a::b would also use {Blind^}, which may produce unexpected results if used in combination with RCtrl. For details, see Blind mode.

上記のホットキーでは、SetKeyDelayの2番目のパラメータ(押す時間)が省略されていることに注意してください。これは、{b down}{b up}のような下方向のみ、上方向のみのイベントには、プレス・デュレーションが適用されないからである。ただし、修飾キー(Shift、Ctrl、Alt、Win)の状態の変化には適用され、a::Ba::^bのようなリマッピングに影響する。その結果、スクリプトの起動時にスクリプトが有効にするプレスデュレーションは、そのような再マッピングすべてに適用される。

リマッピングは前述のようにホットキーに変換されるため、サスペンド機能はそれらに影響する。同様に、ホットキー機能はリマッピングを無効にしたり変更したりすることができる。例えば、以下の2つの関数はa::bのリマッピングを無効にする。

Hotkey "*a", "Off"
Hotkey "*a up", "Off"

Alt-tabの問題:キーやマウスボタンをAltにリマップした場合、そのキーはおそらくAltタブがうまくできないだろう。可能な回避策は、*Tab::Send "{Blind}{Tab}"というホットキーを追加することです。しかし、これは本物の Alt を使って alt-tab するのを邪魔する可能性が高いので注意してください。したがって、リマップキーやalt-tabホットキーのみでalt-tabを行う場合にのみ使用すべきである。

In addition to the keys and mouse buttons on the Key List page, the source key may also be a virtual key (VKnn) or scan code (SCnnn) as described in the Special Keys section. デスティネーション・キーについても同様であるが、バーチャル・キーの後にスキャン・コードを指定することもできる。例えば、sc01e::vk42sc030は、ほとんどのキーボードレイアウトではa::bと等価である。

キーをリマップするのではなく、無効にするには、単にreturnsホットキーにします。例えば、F1::returnF1を無効にする。

以下のキーは、内蔵リマッピング方式ではサポートされていない:

キーボードによるマウスカーソルの移動

キーボードをマウスカーソルの移動に使うことができるのは、フル機能のKeyboard-To-Mouseスクリプトで実証済みだ。このスクリプトは、スムーズなカーソル移動、加速、その他の機能を提供するので、キーボードでのマウス操作が多い場合は、この方法をお勧めする。対照的に、以下の例はよりシンプルなデモンストレーションである:

*#up::MouseMove 0, -10, 0, "R"  ; Win+UpArrow hotkey => Move cursor upward
*#Down::MouseMove 0, 10, 0, "R"  ; Win+DownArrow => Move cursor downward
*#Left::MouseMove -10, 0, 0, "R"  ; Win+LeftArrow => Move cursor to the left
*#Right::MouseMove 10, 0, 0, "R"  ; Win+RightArrow => Move cursor to the right

*<#RCtrl::  ; LeftWin + RightControl => Left-click (hold down Control/Shift to Control-Click or Shift-Click).
{
    SendEvent "{Blind}{LButton down}"
    KeyWait "RCtrl"  ; Prevents keyboard auto-repeat from repeating the mouse click.
    SendEvent "{Blind}{LButton up}"
}

*<#AppsKey::  ; LeftWin + AppsKey => Right-click
{
    SendEvent "{Blind}{RButton down}"
    KeyWait "AppsKey"  ; Prevents keyboard auto-repeat from repeating the mouse click.
    SendEvent "{Blind}{RButton up}"
}

レジストリの "スキャンコードマップ"によるリマッピング

メリット:

デメリット:

レジストリに変更を適用する方法:レジストリからキーのマッピングを変更するには、少なくとも2つの方法がある:

  1. KeyTweak(フリーウェア)のようなプログラムを使って、キーのマッピングを視覚的に変更する。レジストリを変更してくれる。
  2. .regファイル(プレーンテキスト)を作成し、レジストリにロードすることで、手動でキーを再マップする。これはアーカイブされたフォーラムで実証されている。