mieki256's diary



2017/03/02(木) [n年前の日記]

#1 [autohotkey] AutoHotkeyでマウスボタンの状態を画像表示

こんな感じかな…と…。

_picture_display_01.ahk
; picture display test
;
; use AutoHotKey v1.1.24.05

appliname=picture_display_01
appliver=0.0.1
wtitle=%appliname% %appliver%

; 0 is transparent. 255 is opaque
transparentv=210

bgcol=336699
fgcol=FFFFFF
fontsize=32
fontweight=700

; Window init

; Gui, +Owner +AlwaysOnTop +Resize -SysMenu -MinimizeBox -MaximizeBox -Disabled -Caption -Border +ToolWindow
Gui, +Owner +AlwaysOnTop +Resize

Gui, Margin, 8, 0
Gui, Color, %bgcol%

cdir=%A_ScriptDir%
opt=X0 Y0 AltSubmit BackgroundTrans
Gui, Add, Picture, %opt% vIconBas, %cdir%\mouseicon_000.png
Gui, Add, Picture, %opt% vIconLMB, %cdir%\mouseicon_001.png
Gui, Add, Picture, %opt% vIconMMB, %cdir%\mouseicon_002.png
Gui, Add, Picture, %opt% vIconRMB, %cdir%\mouseicon_003.png

Gui, Font, C%fgcol% S%fontsize% W%fontweight% Q2, Arial
Gui, Add, Text, x+0 yp+0 Vbtnstext, Alt+Q ... Exit
Gui, Show, NoActivate, %wtitle%
WinSet, Transparent, %transparentv%, %wtitle%

; GuiControl, , btnstext,
GuiControl, Hide, IconLMB
GuiControl, Hide, IconMMB
GuiControl, Hide, IconRMB

; work init

btnslist := Object("LButton", "IconLMB", "MButton", "IconMMB", "RButton", "IconRMB")
nowstate := Object()
oldstate := Object()
For k, v in btnslist
{
  nowstate.Insert(k, 0)
  oldstate.Insert(k, 0)
}

Loop
{
  ; check status of mouse button
  For k, v in btnslist
  {
    oldstate[k] := nowstate[k]
    GetKeyState, s, %k%
    nowstate[k] := s="D" ? 1 : 0
      
    If (nowstate[k] + oldstate[k]) <> 1
      Continue
    
    If nowstate[k]<>0
    {
      ; pushed button
      GuiControl, Show, %v%
      GuiControl, , btnstext, %k% On
    }
    Else
    {
      ; released button
      GuiControl, Hide, %v%
      GuiControl, , btnstext, %k% Off
    }
  }
  
  Sleep, 16   ; 60 FPS
}

EXIT:
GuiClose:
  ExitApp
  
~!Q Up::
  ; Alt + Q ... Exit
  ExitApp

動作に必要な画像は以下。CC0 / Public Domainってことで。

_mouseicon_000.png
_mouseicon_001.png
_mouseicon_002.png
_mouseicon_003.png

動作に必要ではないけれど、元にしたsvg画像もzipで置いておくです。

_mouseicon_svg.zip

こんな感じの結果に。

picture_display_01_ss01.gif

終了は、ALt+Q を押すか、タスクトレイのアイコンを右クリックしてExitを選択。

補足説明。 :

ずっと無限ループさせてるけど、何もwaitを入れなかったらマウスボタンを押した際に処理待ち?のアイコンが出てしまって少し困ったり。60 FPS程度で回ることを期待して Sleep, 16 を入れてみたら出にくくなった。ちなみに Slepp に指定する数値の単位はms(ミリ秒)。

_Sleep - AutoHotkey Wiki

また、ループするたびに画像の表示/非表示を設定すると該当部分がチラチラしてしまった。ボタンの状態に変化があった時だけ表示/非表示を変更する、みたいなソースにしておかないと表示が見苦しくなるなと。

ボタンの押し下げ状態は、GetKeyState で取得できる。
GetKeyState, 変数, ボタンやキー種類
という形で書く。キー種類の後ろに「, P」もつけられるけど、「P」をつけるとキーカスタマイズソフトの類がキー割り当てを変更してしまう前の状態を返してくるので…。例えば、キー操作・ボタン操作を表示したい、といった場合は「P」をつけないほうが目的を果たせる気もする。要は、とにかく「P」をつけとけばいいのだ、というわけでもなさそうだよ、と。

_GetKeyState - AutoHotkey Wiki

画像の表示は Gui, Add, Picture, を使うけど。表示した画像の表示/非表示の切り替えは、GuiControl, Show, xxxx や GuiControl, Hide, xxxx でいいらしい。対象を指定する xxxx の部分は、Gui, Add, Picture, Vxxxx , 画像ファイル名、と言った形で指定しておく。「v」「V」のどっちを書いたらいいのかは、よく分からない。大文字小文字は区別するのか、区別しないのか…。こういうところにも微かなトラップ臭が。

以上です。

過去ログ表示

Prev - 2017/03 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project