なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこで自動クリックツールを自作する

自動でクリックしてくれるプログラムを作りました。
汎用ではなく、特定のウィンドウ専用のやつ。
3日で2回作り直しました。
その時のメモです。


簡単だと思ったのに!

なでしこにはこのツールに必要な命令が分かりやすくそろっています。
・x,yへマウス移動
・マウスクリック
・s秒待つ
これらをループして混ぜればできあがり!...のはずでした。

・ウィンドウの位置が変わると微調整が必要
・スクロールが必要だった
・ロード時間が超長い時がある
順番に解決していきます。

ウィンドウ位置を変更する

操作対象のウィンドウの位置を固定しましょうか……

HANDLESIZE窓ハンドルサイズ設定

この命令はハンドルとサイズを渡すと移動と幅と高さの設定をしてくれます。
いきなり要求レベルが上がった気がします。

ちょろく生きたいので、母艦の左上のカドを操作対象の左上に合わせてクリックで座標取得することにしました。

窓位置エディタとはエディタ
そのテキスト座標
そのクリック時
  窓位置エディタテキスト母艦位置

エディタなら取得後にコピーも簡単。
これを基準値にして相対座標で記述していけば位置関連は解消。

//操作対象の左上からの相対座標(x,y)をクリック
●マウス移動B(x,y)
 txt=窓位置エディタテキスト
 窓位置X = txt「,」まで切り取る
 窓位置Y = txt「,」まで切り取る
 x=x+窓位置X
 y=y+窓位置Y
 x,yマウス移動
 0.02秒待つ

スクロールさせる

普段は何気なくホイールを回す操作ですが思ったより面倒な奴です。
ホイールのスクロール量はwindowsの設定で変えられるので久しぶりに起動したら暴走する未来が見えます。

キーボードの下キーやPgDown、HomeやEndをキー送信するほうがよさそうです。

●下キー送信
 『{DOWN}』キー送信
 0.02秒待つ

マニュアル探査艦でキー送信を検索すると出てくる通り、『{DOWN}』とかで指定します。

ロード時間に対応する

ネット関連でなくとも外付けHDDだったり、巨大jpgだったり、不定の時間を「待つ」必要が出てきました。
この待ち時間を適切にとらないと、先のキー送信が無視されたり、あらぬところにキー送信されたりしてしまいます。

長めにとるのが簡単ですが、その想定を超えると事故が起こります。
具体的には、バックで開いていたブラウザの広告バナーをめっちゃ連打しました。
やはり「ロードが終わってからマクロを進める」を実装する必要があります。

//カーソル位置が赤なら抜けるサンプル
imgとはイメージ
img可視オフ
1ループ
  x=机上マウスX
  y=机上マウスY
  img「デスクトップ」窓キャプチャ
  col=imgx,y点取得
  col=RGB分解(col)
  母艦タイトルcol
  もしcol=="255,0,0"ならば抜ける //赤色ならば抜ける
  0.2秒待つ

//RGB(r,g,b)を"r,g,b"に戻す
●RGB分解(color)
 rgbとは変数
 rgb[0]=INT(color/256/256)
 rgb[1]=INT(color/256)%256
 rgb[2]=INT(color%256)
 rgb「,」配列結合
 それ戻す

そこで使ったのは 「窓キャプチャ」と「点取得」です。
窓キャプチャはイメージ部品に画像をキャプチャする命令で、点取得はイメージのx,yから色を取得する命令です。
ロードが終わったら何かが表示されるはずなので、それを色で読み解こうということです。

マクロを途中から始める

たとえば「A画面でクリック→B画面がでるまで待つ→B画面でクリック→C画面がでるまで待つ→C画面でクリック→最初に戻る」というマクロを作っている時、すでに画面がB画面である場合。

次イベントとはコンボ
そのアイテム「A画面クリック,B画面クリック,C画面クリック」「,」区切る
そのテキスト「A画面クリック」

実行ボタンとはボタン
そのクリックした時実行ループ

●実行ループ
 1ループ
   script=次イベントテキスト
   それ=0
   scriptナデシコする
   もしそれ==0ならば抜ける //マクロ終了
 母艦タイトル「実行終了」

//ナデシコするで呼ばれる
●A画面クリック
 次イベント「B画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

●B画面クリック
 次イベント「C画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

●C画面クリック
 次イベント「A画面クリック」
 //ここにロード待ちループ
 //ここにクリックイベント
 2秒待つ
 1戻す

コンボボックスを作って、そのテキストをナデシコするで関数を呼び出ししました。
「1を戻す」で成功扱いです。
ロードが終わらないなどのトラブルがあったら「0を戻す」で実行ループを抜けます。
途中から始められることと、コンボボックスを手動で空にすることでマクロを途中停止することができます。
途中から動作と停止は開発中に特に役に立ちます。


これらをループして混ぜればできあがり!