Joy
で始まる。しかし、通常はゲームパッドやステアリングホイールなど、他のゲームコントローラーにも使用できます。以下、最も単純なものから最も複雑なものまで、3つのアプローチを紹介する。最も複雑な方法は、(キーやマウスボタンを押し続ける必要があるゲームなど)最も幅広い状況で機能する。
この方法は、単純なキー入力やマウスクリックを送信する。事例:
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ボタンを左矢印キーにします:
Joy2:: { Send "{Left down}" ; 左矢印キーを押し続けます。 KeyWait "Joy2" ; Wait for the user to release the controller button. Send "{Left up}" ; Release the left-arrow key. }
この方法は、方法#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ハットは矢印キー(左、右、上、下)を送信します:
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などのキーワードで検索すると、興味のあるトピックが見つかるだろう。