自動でクリックしてくれるプログラムを作りました。
汎用ではなく、特定のウィンドウ専用のやつ。
3日で2回作り直しました。
その時のメモです。
簡単だと思ったのに!
なでしこにはこのツールに必要な命令が分かりやすくそろっています。
・x,yへマウス移動
・マウスクリック
・s秒待つ
これらをループして混ぜればできあがり!...のはずでした。
・ウィンドウの位置が変わると微調整が必要
・スクロールが必要だった
・ロード時間が超長い時がある
順番に解決していきます。
ウィンドウ位置を変更する
操作対象のウィンドウの位置を固定しましょうか……
HANDLEにSIZEを窓ハンドルサイズ設定
この命令はハンドルとサイズを渡すと移動と幅と高さの設定をしてくれます。
いきなり要求レベルが上がった気がします。
ちょろく生きたいので、母艦の左上のカドを操作対象の左上に合わせてクリックで座標取得することにしました。
窓位置エディタとはエディタ
そのテキストは座標
そのクリック時は~
窓位置エディタのテキストは母艦の位置
エディタなら取得後にコピーも簡単。
これを基準値にして相対座標で記述していけば位置関連は解消。
//操作対象の左上からの相対座標(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=imgのx,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を戻す」で実行ループを抜けます。
途中から始められることと、コンボボックスを手動で空にすることでマクロを途中停止することができます。
途中から動作と停止は開発中に特に役に立ちます。
これらをループして混ぜればできあがり!