ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】ボタン画像を認識してクリックする関数を FindText で用意した

目次


f:id:yasushiito:20190403184928p:plain

これまでの経緯。

FindText による画像認識に成功したので、ボタンやテキストを探してクリックする関数をこれに置き換えたいと思います。
ImageSearh コマンドを使ったボタンクリック関数はすでに稼働しています。
この方式が有用なケースもありますので、こちらはそのままとっておいて類似品を新規に作成します。

実装結果。

短い処理なので先にスクリプト全体像から。


注意点1 マウスポインターをどかしておく。

自動操作を行う前には、あらかじめマウスポインターを無難な位置にどかしておきます。
私はタスクバーを左端に寄せているのでスクリーンの右下にどかしています。
一般的には右上の方が無難だと思います。
これを怠ると、予期しない場所にポップアップが開くなど画像認識に失敗する 要素が増えます。
画像認識には失敗がつきものですからね。
この関数の結果が「画像認識失敗」の場合にリトライすることをお勧めします。
光学式マウスだとノイズを拾ってブルブルマウスポインターが動くことがあるんですよ。

    ;UI 上のエフェクトを避けるためにマウスポインターをすみっこに寄せておく。
    CoordMode, mouse, Screen
    MouseMove, A_ScreenWidth, A_ScreenHeight, 0

myahk/ClickImage.ahk at master · yasushiito/myahk

注意点2 操作前後にはウェイトを入れる。

画像認識が成功して、目的の画像の位置にマウスポインターが移動した後にも、ウェイトがあった方が良いと思います。
目視で動作確認する時にわかりやすいので。
第2引数でミリ秒単位のウェイトを入れられるようにしています。
マウスポインターが安全な位置にどかされてから画像認識の準備が整うまで、例えば仮面を被っていたタスクバーのポップアップなどが消えるまで、しばらく待つ必要があるからです。

    ;待ち時間の指定の90%の間待機する。
    if delay
        Sleep, delay - delay / 10

myahk/ClickImage.ahk at master · yasushiito/myahk

ただ.画像認識に成功してマウスポインターを移動させ、これからクリックするという寸前に、わずかで良いのでウエイトを入れています。
10で割ったり引いたりしているのはそのためです。
無駄にパラメーター増やしたくないので、第2引数の数値を9割と1割に分割して、クリック直前に少しだけウェイトを入れています。

        ;マウスポインターを移動させてクリック。
        MouseMove, x, y, 0
        if delay
            Sleep, delay / 10

myahk/ClickImage.ahk at master · yasushiito/myahk

注意点3 クリック操作をキャンセルできるようにする。

画像の有無だけを確認したい場合もあるので、第3引数でクリックせずに成功として返す できるようにしておきます。
それ以外にも、 テストの確認などで ユーザのリアクションによって途中でキャンセルできる機能も備えておきます。
私はマウス以外にはデバイスを操作できないので、必然的にマウス左ボタンでキャンセルしています。

        ;オプション指定されているときはクリックしない。
        if !noclick
            ;マウスの左ボタンをプッシュしているときもクリックしない。
            GetKeyState, lb, LButton
            if lb = U
                MouseClick, Left

myahk/ClickImage.ahk at master · yasushiito/myahk

注意点4 スクリーン全体から探す。

画像を探す領域を絞った方がパフォーマンスは上がりますが、スクリーン全体からしか探せません。


この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら