ボタンなどの画像を見つけてクリックする AutoHotkey

2023年11月7日

AutoHotkey v2.0

キーボードのホットキーをカスタマイズするソフトです。自動化などいろいろなことができます。AutoHotkey v2.0にバージョンアップしたのでこちらを使います

https://www.autohotkey.com/

私はZIPを使います
https://www.autohotkey.com/download/

SciTE4AutoHotkey 編集から実行までできる環境です
https://www.autohotkey.com/scite4ahk/

解凍したフォルダーのAutoHotkey64.exeをコピーして名前をAutoHotkey.exeに変更します

簡単なスクリプトの例

loop
{
 Clickimage(".\images\a.bmp",10,10,,500)
 sleep 1000
}
Persistent

Clickimage(img,posdx:=0,posdy:=0, noclick:="noclick",waittime:=0, noreturn:="noreturn",ambiguity:=30){
    wd := A_WorkingDir
    SetWorkingDir A_ScriptDir
    ret := False

    if FileExist(img)
    {

	if ImageSearch(&FoundX, &FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, "*" ambiguity " " img)
        {
	    MouseGetPos &mouseX, &mouseY, &id, &control
            MouseMove FoundX+posdx, FoundY+posdy, 100
            ToolTip "X:" FoundX " Y:" FoundY,FoundX,FoundY
            if not (noclick = "noclick")
                MouseClick noclick,,,,
			ret := True
			sleep waittime
            ToolTip
;            if !noreturn
            if not (noreturn = "noreturn")
				MouseMove mouseX, mouseY, 0
        }
		else
		    ret := False
    }
    SetWorkingDir wd
    sleep 500

    return ret
}

スクリプト

imagesホルダーに決まった形式のファイル名でイメージファイルを置くとパラメーターを指定して動かすことができます。画像の見つかった場所から右にDX 下ににDYずらします。左クリックするかクリックしないかを指定できます。クリックした後の待ち時間を1000ミリ秒で指定します。元の場所にカーソルを戻すか戻さないかを指定します。色の曖昧さを指定します。調べる場所を指定します。キーを押します。

img_posdx_posdy_ noclick_waittime_noreturn_ambiguity_gravity_key.bmp

g.bmp

gx_10_10_noclick_100_return_30_southeast.bmp

t_10_10_left_100_noreturn_30 #north_{End}.bmp

Pauseキーで一時停止再開をします 見つかったらビープ音を鳴らします。

global eflg := false
global eflg := true
ecnt := 0
ecnt2 := 0
imagesfld := "images"
Arr := ["img",10,10, "left",100, "return",30,"fullscreen",""]

;
Itemnull :=
Item := Array()


loop
{
    if eflg
     {
		MouseGetPos &mouseXa, &mouseYa
        mouseXb := mouseXa
        mouseYb := mouseYa
        sleep 3000
		MouseGetPos &mouseXa, &mouseYa
        if mouseXb = mouseXa and mouseYb = mouseYa
        {
            if ecnt = 0
            {
;                ecnt++
;                Clickimage(".\images\a.bmp",10,10,,500)
                Loop Files, A_ScriptDir "\" imagesfld "\*.*"
                {
                    fileItem := StrSplit(A_LoopFileName, ".")
                    Item := StrSplit(fileItem[1], "_")
                    Loop 9- Item.Length
                        Item.Push Itemnull
                        ; a_10_10_left_500_return_30_southwest_{End}.bmp
                    Loop  9
                    {
                        if Item[A_Index] = Itemnull
                            Item[A_Index] := Arr[A_Index]
;MsgBox A_LoopFileFullPath Item[2] Item[3] Item[4] Item[5] Item[6] Item[7] , ,"T57"

                    }

;                    if Clickimage(A_LoopFileFullPath,10,10,"left",500,"return") = true
                    if Clickimage(A_LoopFileFullPath ,Item[2]*1,Item[3]*1,Item[4],Abs(Item[5]),Item[6],Abs(Item[7]),Item[8]) = true
                    {
                        ecnt2++
                        if not (Item[9] = "" or Item[9] =Itemnull)
                        {
  ;                          MsgBox Item[9] , ,"T5"

                            send Item[9]
                        }
                    }
                }
            }
            ecnt++

        }
        else
        {
            ecnt := 0
        }
     }
sleep 1000
}
Persistent
Pause::
{
     global eflg
    if eflg
          MsgBox "clickimage is not active.", ,"T5"
     else
          MsgBox "clickimage is active.", ,"T5"
     eflg := !eflg

}

Clickimage(img,posdx:=0,posdy:=0, noclick:="noclick",waittime:=0, noreturn:="noreturn",ambiguity:=30,gravity:="fullscreen"){
    wd := A_WorkingDir
    SetWorkingDir A_ScriptDir
    ret := False
    b1x := 1
    b1y := 1
    If InStr(gravity, "north")
        b1y--
    If InStr(gravity, "south")
        b1y++
    If InStr(gravity, "west")
        b1x--
    If InStr(gravity, "east")
        b1x++
    If InStr(gravity, "#north")
        b1y+=0.5
    If InStr(gravity, "#south")
        b1y-=0.5
    If InStr(gravity, "#west")
        b1x+=0.5
    If InStr(gravity, "#east")
        b1x-=0.5


    if  (gravity = "fullscreen")
    {
        bx := 0
        by := 0
        bw := A_ScreenWidth
        bh := A_ScreenHeight
    }
    else
    {
        bx := Round(A_ScreenWidth*b1x/3)
        by := Round(A_ScreenHeight*b1y/3)
        bw := Round(A_ScreenWidth/3)+bx
        bh := Round(A_ScreenHeight/3)+by
    }

  ;
; MsgBox bx " " by " "  bw " " bh gravity, ,"T55"

    if FileExist(img)
    {

		if ImageSearch(&FoundX, &FoundY, bx, by, bw, bh, "*" ambiguity " " img)
        {
            SoundBeep
			MouseGetPos &mouseX, &mouseY, &id, &control
            MouseMove FoundX+posdx, FoundY+posdy, 100
            ToolTip "X:" FoundX " Y:" FoundY,FoundX,FoundY
            if not (noclick = "noclick")
                MouseClick noclick,,,,
			ret := True
			sleep waittime
            ToolTip
;            if !noreturn
            if not (noreturn = "noreturn")
				MouseMove mouseX, mouseY, 0
        }
		else
		    ret := False
    }
    SetWorkingDir wd
    sleep 200

    return ret
}

スクリーンショットの方法

例えばscreenpresso

https://www.screenpresso.com/ja/