見出し画像

AutoHotKeyで画像認識してクリックを自動化する【ImageSearch】

座標指定だと上手くいかないブラウザ上での作業を楽にしたくて書いた。
[ウィンドウの要素を取得してあれこれすればできるらしい]けどよく分からなかったので

・クリックしたい場所を事前にスクショ
・スクショをもとに画像認識して自動でクリック

というプロセスを取った。
折角なので共有する。

s::
    Loop, 10
    {
        click_by_image("img/hogehoge.png", 20, 0)
        click_by_image("img/fugafuga.png", 100, 0)
        click_by_image("img/piyopiyo.png", 20, 1000)
    }

    click_by_image(imgpath, posadj, delay)
    {
        ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %imgpath%
        FoundX += posadj
        FoundY += posadj
            MouseGetPos mouseX, mouseY, 0
            MouseMove FoundX, FoundY, 0	
            Click, FoundX FoundY
            Sleep, 500
            Sleep, delay
    }


Esc::ExitApp    ;終了

画面上から特定の画像に一致する部分を検索できる ImageSearch を利用している。

上の Loop の中に入っている
click_by_image("img/hogehoge.png", 20, 0)
の行をいじるだけで使える。

1つ目の引数には画像パスを入力。この.ahkファイルがあるところを基準とした相対パスで指定。imgフォルダを作ってその中に画像を入れとくと便利。
ファイル名・フォルダ名に全角文字を使うとバグる。
クリックしたい場所を左上に合わせてスクショをトリミングしておくと後が楽。

たとえばChromeの新規タブの音声入力ボタンをクリックしたい場合、
こうではなく
こうする

2つ目の引数には画像の最も左上のピクセルから何ピクセル右下をクリックするかを入力。
10 の場合、a.png の最も左上のピクセルから20ピクセル右下をクリックする。
入力画像のクリック位置を左上に合わせておくとここの調整が楽。
右にXピクセル、下にYピクセルずらしてクリックしたい場合はプログラムを

click_by_image(imgpath, posadjX, posadjY, delay)
{
    ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %imgpath%
    FoundX += posadjX
    FoundY += posadjY

こうすればOK。

3つ目の引数には遅延時間を入力。
既にclick_by_imageの中に  Sleep, 500  が入っているので、これよりも追加でクリックを遅延させる場合に使う。

以下注意点。
・サブモニターの領域は検索しない
 →マルチモニターの人はメインモニターだけで完結させる必要がある
・ループを終えてもEscを押さない限りプログラム自体は終了しない
 →ループ中でもEscを押せば終了できる

あとは  loop  の値を適宜調節して使ってほしい。


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