2017/03/03(金) [n年前の日記]
#2 [autohotkey] AutoHotkeyでマウスホイールの回転を検出
こんな感じだろうか…。
_wheelupdown_check_01.ahk
結果はこんな感じに。

_wheelupdown_check_01.ahk
; wheel up/down check
; use AutoHotKey v1.1.24.05
#SingleInstance, Force
#InstallMouseHook
appliname=wheelupdown_check_01
appliver=0.0.1
wtitle=%appliname% %appliver%
; GUI settings
; Gui, +Owner +AlwaysOnTop +Resize -SysMenu -MinimizeBox -MaximizeBox -Disabled -Caption -Border +ToolWindow
Gui, +Owner +AlwaysOnTop +Resize -MinimizeBox -MaximizeBox
Gui, Color, 336699
Gui, Font, CFFFFFF S26 W700 Q2, Arial
Gui, Add, Text, Vkeystext, Alt+Q ... Exit
Gui, Show, NoActivate, %wtitle%
; GuiControl, , keystext,
WinSet, Transparent, 220, %wtitle%
cwheeldown = 0
cwheelup = 0
check_cwheeldown = 0
check_cwheelup = 0
ks=WheelDown WheelUp Space Up Down Left Right BS
keyslist := Object()
nowstate := Object()
oldstate := Object()
Loop, Parse, ks, %A_Space%
{
k=%A_LoopField%
v=%k%
keyslist.Insert(k, v)
nowstate.Insert(k, 0)
oldstate.Insert(k, 0)
}
Loop,
{
For k, v in keyslist
{
n := nowstate[k]
oldstate[k] := n
nowstate[k] := 0
If k=WheelDown
{
If cwheeldown<>%check_cwheeldown%
{
check_cwheeldown := cwheeldown
nowstate[k] := 1
}
}
Else If k=WheelUp
{
If cwheelup<>%check_cwheelup%
{
check_cwheelup := cwheelup
nowstate[k] := 1
}
}
Else
{
nowstate[k] := GetKeyState(k)
}
}
keys=
For k, v in keyslist
{
If (nowstate[k] + oldstate[k])=1
If nowstate[k]<>0
keys=%keys% %k%
}
keys := Trim(keys, " ")
If keys<>
GuiControl, , keystext, %keys%
Sleep, 16
}
EXIT:
GuiClose:
ExitApp
~*WheelDown::
cwheeldown += 1
return
~*WheelUp::
cwheelup += 1
return
~!Q Up::
; Alt + Q ... Exit
Goto, EXIT
結果はこんな感じに。

◎ 補足説明。 :
以下のやり取りを参考にして書いてみたり。
_getkeystate wheel (Getkeystate not wheely good!) - Ask for Help - AutoHotkey Community
GetKeyStateを使ってホイール回転を検出しようとすると、ホイールを回した途端、そこからずっとOnが返ってくる状態になってしまう。しかし、ホットキーラベル(WheelDown::、WheelUp:: 等)を使うと、そこはホイールを回した瞬間だけ呼ばれるようで。なので、そこで変数の内容をインクリメントして、メインループ内で「変数の内容が今までと違っているか」を調べて、ホイール回転があったかどうかを判断してる。
GetKeyState は、「GetKeyState, 変数, キー種類」という形でも書けるけど、「n := GetKeyState(キー種類)」という形で書けば、1/0で状態を取得できるらしい。
_getkeystate wheel (Getkeystate not wheely good!) - Ask for Help - AutoHotkey Community
GetKeyStateを使ってホイール回転を検出しようとすると、ホイールを回した途端、そこからずっとOnが返ってくる状態になってしまう。しかし、ホットキーラベル(WheelDown::、WheelUp:: 等)を使うと、そこはホイールを回した瞬間だけ呼ばれるようで。なので、そこで変数の内容をインクリメントして、メインループ内で「変数の内容が今までと違っているか」を調べて、ホイール回転があったかどうかを判断してる。
GetKeyState は、「GetKeyState, 変数, キー種類」という形でも書けるけど、「n := GetKeyState(キー種類)」という形で書けば、1/0で状態を取得できるらしい。
[ ツッコむ ]
以上です。