コントローラをキーボードまたはマウスにリマップする

目次

重要な注意事項

コントローラボタンがキーストロークやマウスクリックを送るようにする

さまざまなアプローチ

以下、最も単純なものから最も複雑なものまで、3つのアプローチを紹介する。最も複雑な方法は、(キーやマウスボタンを押し続ける必要があるゲームなど)最も幅広い状況で機能する。

方法 #1

この方法は、単純なキー入力やマウスクリックを送信する。事例:

Joy1::Send "{Left}"  ; Have button #1 send a left-arrow keystroke.
Joy2::Click  ; Have button #2 send a click of left mouse button.
Joy3::Send "a{Esc}{Space}{Enter}"  ; Have button #3 send the letter "a" followed by Escape, Space, and Enter.
Joy4::Send "Sincerely,{Enter}John Smith"  ; Have button #4 send a two-line signature.

To have a button perform more than one line, put them beneath the button name and enclose them in braces. 事例:

Joy5::
{
    Run "notepad"
    WinWait "Untitled - Notepad"
    WinActivate
    Send "This is the text that will appear in Notepad.{Enter}"
}

For details, see How to Write Hotkeys.

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

方法 #2

この方法は、コントローラーのボタンを押している間ずっと、キーやマウスのボタンを押し続けなければならない場合に必要です。次の例では、コントローラーの第2ボタンを左矢印キーにします:

Joy2::
{
    Send "{Left down}"  ; 左矢印キーを押し続けます。
    KeyWait "Joy2"  ; Wait for the user to release the controller button.
    Send "{Left up}"  ; Release the left-arrow key.
}

方法 #3

この方法は、方法#2で説明したタイプのコントローラーホットキーが複数あり、そのようなホットキーを同時に押したり離したりすることがある場合に必要です。次の例では、コントローラの第3ボタンをマウスの左ボタンにします:

Joy3::
{
    Send "{LButton down}"   ; Hold down the left mouse button.
    SetTimer WaitForButtonUp3, 10
}

WaitForButtonUp3()
{
    if GetKeyState("Joy3")  ; The button is still, down, so keep waiting.
        return
    ; Otherwise, the button has been released.
    Send "{LButton up}"  ; Release the left mouse button.
    SetTimer , 0
}

キーストロークの自動繰り返し

プログラムやゲームによっては、(キーボードを押し続けているように)キーを繰り返し送信する必要がある場合があります。以下の例では、コントローラーの第2ボタンを押しながらスペースバーのキー入力を繰り返すことでこれを実現しています:

Joy2::
{
    Send "{Space down}"   ; Press the spacebar down.
    SetTimer WaitForJoy2, 30  ; Reduce the number 30 to 20 or 10 to send keys faster. Increase it to send slower.
}

WaitForJoy2()
{
    if not GetKeyState("Joy2")  ; The button has been released.
    {
        Send "{Space up}"  ; Release the spacebar.
        SetTimer , 0  ; Stop monitoring the button.
        return
    }
    ; Since above didn't "return", the button is still being held down.
    Send "{Space down}"  ; Send another Spacebar keystroke.
}

状況に応じたコントローラーボタン

#HotIfディレクティブを使用すると、アクティブなウィンドウの種類などの条件に応じて、選択したコントローラのボタンに異なるアクションを実行させることができます。

コントローラーをマウスとして使う

Controller-To-Mouseスクリプトは、ボタンと軸制御を再マッピングすることで、コントローラをマウスに変換します。

他のコントローラコントロールにキーストロークまたはマウスクリックを送信させる

To have a script respond to movement of a stick's axis or POV hat, use SetTimer and GetKeyState.

コントローラー軸

The following example makes the stick's X and Y axes behave like the arrow key cluster on a keyboard (left, right, up, and down):

SetTimer WatchAxis, 5

WatchAxis()
{
    static KeyToHoldDown := ""
    JoyX := GetKeyState("JoyX")  ; Get position of X axis.
    JoyY := GetKeyState("JoyY")  ; Get position of Y axis.
    KeyToHoldDownPrev := KeyToHoldDown  ; Prev now holds the key that was down before (if any).

    if JoyX > 70
        KeyToHoldDown := "Right"
    else if JoyX < 30
        KeyToHoldDown := "Left"
    else if JoyY > 70
        KeyToHoldDown := "Down"
    else if JoyY < 30
        KeyToHoldDown := "Up"
    else
        KeyToHoldDown := ""

    if KeyToHoldDown = KeyToHoldDownPrev  ; The correct key is already down (or no key is needed).
        return  ; 何もしません。

    ; Otherwise, release the previous key and press down the new key:
    SetKeyDelay -1  ; Avoid delays between keystrokes.
    if KeyToHoldDownPrev   ; There is a previous key to release.
        Send "{" KeyToHoldDownPrev " up}"  ; Release it.
    if KeyToHoldDown   ; There is a key to press down.
        Send "{" KeyToHoldDown " down}"  ; Press it down.
}

コントローラーPOVハット

次の例では、コントローラのPOVハットをキーボードの矢印キーのように動作させます; つまり、POVハットは矢印キー(左、右、上、下)を送信します:

SetTimer WatchPOV, 5

WatchPOV()
{
    static KeyToHoldDown := ""
    POV := GetKeyState("JoyPOV")  ; Get position of the POV control.
    KeyToHoldDownPrev := KeyToHoldDown  ; Prev now holds the key that was down before (if any).

; Some controllers might have a smooth/continous POV rather than one in fixed increments.
    ; To support them all, use a range:
    if POV < 0   ; No angle to report
        KeyToHoldDown := ""
    else if POV > 31500                ; 315 to 360 degrees: Forward
        KeyToHoldDown := "Up"
    else if POV >= 0 and POV <= 4500      ; 0 to 45 degrees: Forward
        KeyToHoldDown := "Up"
    else if POV >= 4501 and POV <= 13500  ; 45 to 135 degrees: Right
        KeyToHoldDown := "Right"
    else if POV >= 13501 and POV <= 22500 ; 135 to 225 degrees: Down
        KeyToHoldDown := "Down"
    else                                  ; 225 to 315 degrees: Left
        KeyToHoldDown := "Left"

    if KeyToHoldDown = KeyToHoldDownPrev  ; The correct key is already down (or no key is needed).
        return  ; 何もしません。

    ; Otherwise, release the previous key and press down the new key:
    SetKeyDelay -1  ; Avoid delays between keystrokes.
    if KeyToHoldDownPrev   ; There is a previous key to release.
        Send "{" KeyToHoldDownPrev " up}"  ; Release it.
    if KeyToHoldDown   ; There is a key to press down.
        Send "{" KeyToHoldDown " down}"  ; Press it down.
}

キーストロークの自動繰り返し

上記のどちらの例も、単にキーを押し続けるのではなく、繰り返しキーを送るように修正することができる(つまり、キーボードのキーを物理的に押し続けることを模倣することができる)。これを行うには、以下の行を置き換える:

return  ; 何もしません。

With the following:

{
    if KeyToHoldDown
        Send "{" KeyToHoldDown " down}"  ; Auto-repeat the keystroke.
    return
}

備考

ボタンまたは軸名の前にコントローラの番号を付けることで、最初以外のコントローラを使用できます。例えば、2Joy1は、2つ目のコントローラーの最初のボタンとなる。

他の便利なコントローラスクリプトを見つけるには、AutoHotkeyフォーラムをご覧ください。Controller、GetKeyState、Sendなどのキーワードで検索すると、興味のあるトピックが見つかるだろう。