見出し画像

AutoHotkeyのGUIコントロールにマウスオーバーした時マウスカーソルの形を変えるAutoHotkeyのスクリプト

AutoHotkeyのGUIで
アプリランチャーのようなものを作成して使用しているのですが

「Gui, Add, Picture」などのコントロール部分を
マウスオーバーしても変化がなく
コントロール部分を選択できているか視認しづらいので

何か方法はないかと探したら下記の記事に
「マウスオーバー時にマウスカーソルの形を変える
AutoHotkeyのスクリプト」が公開されていて
便利なのでこのスクリプトを紹介/解説してみる。


このスクリプトをGUIに記述すると
「Gui, Add, Text」や「Gui, Add, Picture」の
コントロール部分にマウスオーバーした際に
マウスカーソルの形が「Hand」などに変化するようになります。

GUI例

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")

この記事が気に入ったらサポートをしてみませんか?