Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

だいぶ前に作った上ごちゃごちゃしているので弄り直したくない。
マウスのカーソル移動及びクリック動作、キー入力(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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away