AutoHotkeyのGUIコントロールにマウスオーバーした時マウスカーソルの形を変えるAutoHotkeyのスクリプト
AutoHotkeyのGUIで
アプリランチャーのようなものを作成して使用しているのですが
「Gui, Add, Picture」などのコントロール部分を
マウスオーバーしても変化がなく
コントロール部分を選択できているか視認しづらいので
何か方法はないかと探したら下記の記事に
「マウスオーバー時にマウスカーソルの形を変える
AutoHotkeyのスクリプト」が公開されていて
便利なのでこのスクリプトを紹介/解説してみる。
このスクリプトをGUIに記述すると
「Gui, Add, Text」や「Gui, Add, Picture」の
コントロール部分にマウスオーバーした際に
マウスカーソルの形が「Hand」などに変化するようになります。
AutoHotkeyのGUIを利用していて
マウスオーバー時に何かしらの変化が欲しいと思っている方は
利用してみてください。
AutoHotkeyをインストール済みで
ある程度知識がある人向けの内容になりますスクリプトはAutoHotkey「v1.1」用のものです
環境などによっては上手く動作しない可能性があります
ご利用は自己責任でお願いします
スクリプト例
このスクリプトをGUIに記述すると
コントロール部分にマウスオーバーした際に
マウスカーソルの形が「Hand」に変化するスクリプトになります。
このスクリプトでは
マウスカーソルの形が「Hand」に変化するGUIコントロールと
変化しないGUIコントロールがあり
「Gui, Add, Text」と「Gui, Add, Picture」で変化するのを確認しています。
マウスカーソルの形は変更も可能です。(後述)
「Gui, Add」の数に対して
「SetCursor("Hand", "Static")」の数を合わせる必要があります。(後述)
SetCursor(pShape, pCtrl="") {
return SetCursor_(pShape, pCtrl, 0, 0)
}
SetCursor_(wparam, lparam, msg, hwnd) {
static WM_SETCURSOR := 0x20, WM_MOUSEMOVE := 0x200
static APPSTARTING := 32650,HAND := 32649 ,ARROW := 32512,CROSS := 32515 ,IBEAM := 32513 ,NO := 32648 ,SIZE := 32640 ,SIZEALL := 32646 ,SIZENESW := 32643 ,SIZENS := 32645 ,SIZENWSE := 32642 ,SIZEWE := 32644 ,UPARROW := 32516 ,WAIT := 32514
static SIZEWE_BIG := 32653, SIZEALL_BIG := 32654, SIZEN_BIG := 32655, SIZES_BIG := 32656, SIZEW_BIG := 32657, SIZEE_BIG := 32658, SIZENW_BIG := 32659, SIZENE_BIG := 32660, SIZESW_BIG := 32661, SIZESE_BIG := 32662
static hover, curOld=32512, cursor, ctrls="`n", init
if !init
init := 1, OnMessage(WM_SETCURSOR, "SetCursor_"), OnMessage(WM_MOUSEMOVE, "SetCursor_")
if A_Gui =
{
if wparam is not Integer
If InStr( wparam, ".cur" ) || InStr( wparam, ".ani" ) { ;LoadCursorFromFile
IfNotExist, % WPARAM ; verify existance
return
cursor := DllCall("LoadCursorFromFile", "Str", WPARAM)
}
Else cursor := DllCall("LoadCursor", "Uint", 0, "Int", %WPARAM%, "Uint")
if lparam =
curOld := cursor
else ctrls .= lparam "=" cursor "`n"
}
If (msg = WM_SETCURSOR)
ifEqual, hover, 1, return 1
if (msg = WM_MOUSEMOVE)
{
MouseGetPos, ,,,c
If j := InStr(ctrls, "`n" c "=")
{
hover := true,
j += 2+StrLen(c)
j := SubStr(ctrls, j, InStr(ctrls, "`n", 0, j)-j+1)
DllCall("SetCursor", "uint",j)
}
else DllCall("SetCursor", "uint", curOld), hover := ""
}
}
SetCursor("Hand", "Static1")
SetCursor("Hand", "Static2")
SetCursor("Hand", "Static3")
SetCursor("Hand", "Static4")
SetCursor("Hand", "Static5")
「SetCursor("Hand", "Static")」の解説
ほとんどのコードはどういう意味なのか理解できていませんが
「SetCursor("Hand", "Static")」に関しては
例えば下記のように4つの「Gui, Add」を利用するなら
Gui, Add, Text, Options, 1
Gui, Add, Text, Options, 2
Gui, Add, Picture, Options, 3
Gui, Add, Picture, Options, 4
「SetCursor("Hand", "Static")」の数は4つ必要で
下記のように記述します。
SetCursor("Hand", "Static1")
SetCursor("Hand", "Static2")
SetCursor("Hand", "Static3")
SetCursor("Hand", "Static4")
「SetCursor("Hand", "Static1")」が
「Gui, Add, Text, Options, 1」に対応し
「SetCursor("Hand", "Static2")」が
「Gui, Add, Text, Options, 2」に対応し
「SetCursor("Hand", "Static3")」が
「Gui, Add, Picture, Options, 3」に対応し
「SetCursor("Hand", "Static4")」が
「Gui, Add, Picture, Options, 4」に対応する仕様となります。
スクリプト例ではカーソルの形は全て「Hand」を設定していますが
変えることも出来て個別に変えることも出来ます。
SetCursor("Hand", "Static1")
SetCursor("Cross", "Static2")
SetCursor("IBeam", "Static3")
SetCursor("No", "Static4")
この記事が気に入ったらサポートをしてみませんか?