Autohotkeyとゲームパッドによるマウス・キーボード操作


だいぶ前に作った上ごちゃごちゃしているので弄り直したくない。
マウスのカーソル移動及びクリック動作、キー入力(2キーまで同時キーリピート可)をゲームパッドで行う。
同じパスのJM.iniファイルで左右中クリック、カーソル加速ボタン、スクロールボタン、カーソル速度、スクロール速度を設定する。
出来の悪いアナログスティックでも勝手にカーソルが動き出さないように配慮した。
ボタン番号はパッドごとに違うので自分で調べなければならない。

カーソル移動とスクロールの切り替えはTimerの切り替えによる。カーソル移動のTimerが常駐し、スクロールボタンが押されている間停止してスクロール用のTimerが起動する。

iniファイル分離は機能の制約にもなるので完全に余計だった。素直にスクリプト内に
Joy10::hoge
と書けばよい。

JM.ini

[Click]
L=3
R=2
M=4
S=1
;押している間カーソル移動がスクロールになる
A=7
;押している間カーソル移動が早くなる
[Speed]
MD=4
;標準のカーソル移動速度
MA=8
;早い時のカーソル移動速度
MW=150
;ホイール速度
[Script]

[Key]
5=Enter
6=Esc
8=BS
;対応ボタンとキー名を指定して追加できる。

Joymouse.ahk

#persistent
CoordMode,Mouse,Screen
SetFormat,Float,0.0
SetDefaultMouseSpeed,0

KeyRepeatCount:=0
Key2RepeatCount:=0

IfNotExist,JM.ini,{
msgbox,no ini file.
ExitApp
}

IniRead,LeftClick,JM.ini,Click,L
IniRead,RightClick,JM.ini,Click,R
IniRead,MiddleClick,JM.ini,Click,M
IniRead,MouseAccel,JM.ini,Click,A
IniRead,Scroller,JM.ini,Click,S

IniRead,MouseDefaultSpeed,JM.ini,Speed,MD
IniRead,MouseAccelSpeed,JM.ini,Speed,MA
IniRead,ScrollRepeatSpeed,JM.ini,Speed,MW

Loop,16
{
IniRead,Joy%A_Index%K,JM.ini,Key,%A_Index%
Hotkey,Joy%A_Index%,KeyStroke

}

SetTimer,Move,10

Hotkey,Joy%LeftClick%,LClickStart
Hotkey,Joy%RightClick%,RClickStart
Hotkey,Joy%MiddleClick%,MClickStart
Hotkey,Joy%Scroller%,ScrollStart

return

;--------------------Cursor functions start --------------------

Move:
GetKeyState,JA,Joy%MouseAccel%
GetKeyState,JX,JoyX
GetKeyState,JY,JoyY
If(JA == "D"){
SP:= MouseAccelSpeed
}
else,{
SP:= MouseDefaultSpeed
}
JX-=50 ;端数を切る
JX/=15
JY-=50
JY/=15
MouseMove,JX *SP ,JY *SP ,,R

return

;--------------------Cursor functions end --------------------

;--------------------Scroll functions start --------------------

ScrollStart:
SetTimer,Move,Off
SetTimer,Scroll,%ScrollRepeatSpeed%
return

Scroll:
GetKeyState,JX,JoyX
GetKeyState,JY,JoyY
If(JX < 40){
Click,WheelLeft
}
If(JX > 60){
Click,WheelRight
}
If(JY < 40){
Click,WheelUp
}
If(JY > 60){
Click,WheelDown
}

GetKeyState,JW,Joy%Scroller%
If(JW == "U"){
SetTimer,Move,10
SetTimer,Scroll,Off
}

return

;--------------------Scroll functions end --------------------

;--------------------Click functions start --------------------
LClickStart:
Click,Left,Down
SetTimer,LClick,10
return

LClick:
GetKeyState,JL,joy%LeftClick%
If(JL == "U"){
Click,Left,Up
SetTimer,LClick,Off
}
return

RClickStart:
Click,Right,Down
SetTimer,RClick,10
return

RClick:
GetKeyState,JR,joy%RightClick%
If(JR == "U"){
Click,Right,Up
SetTimer,RClick,Off
}
return

MClickStart:
Click,Middle,Down
SetTimer,MClick,10
return

MClick:
GetKeyState,JM,Joy%MiddleClick%
If(JM == "U"){
Click,Middle,Up
SetTimer,MClick,Off
}
return

;--------------------Click functions end --------------------

KeyStroke:
If(JK==blank){
JK := A_ThisHotkey
JF := %JK%K
SetTimer,KeyRepeatWait,50
}
else,{
JK2 := A_ThisHotkey
JF2 := %JK2%K
SetTimer,Key2RepeatWait,50
}

return

KeyRepeatWait:
KeyRepeatCount++
If(KeyRepeatCount > 10){
SetTimer,KeyRepeatWait,off
SetTimer,KeyRepeat,50
}
GetKeyState,JKState,%JK%
If(JKState == "U"){
send,{%JF%}
KeyRepeatCount:=0
SetTimer,KeyRepeatWait,off
JK:=blank
}
return

KeyRepeat:
send,{%JF%}
GetKeyState,JKState,%JK%
If(JKState == "U"){
KeyRepeatCount:=0
SetTimer,KeyRepeat,off
JK:=blank
}
return

Key2RepeatWait:
Key2RepeatCount++
If(Key2RepeatCount > 10){
SetTimer,Key2RepeatWait,off
SetTimer,Key2Repeat,50
}
GetKeyState,JK2State,%JK2%
If(JK2State == "U"){
send,{%JF2%}
Key2RepeatCount:=0
SetTimer,Key2RepeatWait,off
JK2:=0
}
return

Key2Repeat:
send,{%JF2%}
GetKeyState,JK2State,%JK2%
If(JK2State == "U"){
Key2RepeatCount:=0
SetTimer,Key2Repeat,off
JK2:=0
}
return