Windows自動化ソフト AutoIt のメモ

特定のコントロールを指定して自動的に文字列を入力するControlSendなど、
コントロールを指定して自動的に操作するControl系関数がControlClick以外にもいろいろある。(参考:Functions)
Control系関数を使えば、単純な作業を自動化できる!と思ったが、そう簡単ではなかった。
4.つまづいた点など
4.1.ウィンドウがアクティブでない問題
ControlClickの説明に、次の注意書きがある。
「ウィンドウがアクティブでないとコマンドに反応しないコントロールがあります。その場合、ControlClick()を使用する前にWinActivate()を使ってコントロールのあるウィンドウを最前面に表示してください。」
問題
WinActivateは、すでに開いているウィンドウをアクティブにする場合には使える。
しかし、開いている途中のウィンドウをアクティブにすることはできない。
解決策
WinWaitActiveを使って、操作したいウィンドウがアクティブになるのを待つ。
具体的には、WinWaitActive関数の後に、Control系関数を書く。
問題
操作したいウィンドウ名を指定できない。例えばウィンドウ名が一定ではない場合がある。
解決策?
手動なら解決できる
操作したいウィンドウがアクティブになったらことを目視したら、メッセージボックスのOKボタンを手動で押すようにする。(自動化じゃなくなる)
例
メッセージボックス(MsgBox)を表示させ、スクリプトを一時停止させる。
メッセージボックスのOKボタンが押されたら、スクリプトの実行を再開する。
キャンセルボタンが押されたら、スクリプトを終了するようにしておくと便利。
具体例
Dim $check
$check = MsgBox(1,”確認”,”プログラムを続ける場合はOKを押す”);OK,キャンセルの確認
WinWaitClose(“確認”)
If $check == 2 Then ;キャンセルの場合
Exit;プログラム終了
EndIf
4.2.コントロールがアクティブでない問題
問題
ウィンドウがアクティブになったが、操作したいコントロールがアクティブになっていない場合は、そのコントロールを操作できない。
問題の具体例
ネットからファイルをダウンロードすると、次のようなウィンドウが出てくる。
ControlClickを使って、「ファイルを保存」(操作したいコントロール)をクリックしたい。
しかし、ウィンドウがアクティブになってから、「ファイルを保存」がアクティブになるまでに、タイムラグがある。
そのため、ウィンドウがアクティブになった直後に、「ファイルを保存」を押すという命令(ControlClick)が実行されても、アクティブになっていない「ファイルを保存」をクリックできない。

ウィンドウがアクティブになるのを待つ関数(WinWaitActive)はあるが、
コントロールがアクティブになるのを待つ関数はない(はず)。
解決策1
Sleepで時間調整する。(不確実な方法)
ウィンドウがアクティブになってから、操作したいコントロールがアクティブになるまでのタイムラグ+αの時間、スクリプトの実行を停止させる。
PCの状態によってタイムラグが変わるので、「+α」を十分長くしておく。
解決策2
操作したいコントロールがアクティブになったことを目視したら、手動でメッセージボックスのボタンを押すようにする。(自動化じゃなくなる)
例
ウィンドウがアクティブになると、メッセージボックス(MsgBox)を表示させる。
メッセージボックスのOKボタンが押されたら、スクリプトの実行を再開する。
キャンセルボタンが押されたら、スクリプトを終了するようにしておくと便利。
具体例
Dim $check
$check = MsgBox(1,”確認”,”プログラムを続ける場合はOKを押す”);OK,キャンセルの確認
WinWaitClose(“確認”)
If $check == 2 Then ;キャンセルの場合
Exit;プログラム終了
EndIf
4.3.コントロールを指定できない
問題
コントロールをうまく指定できない
例えばコントロールのIDが一定でない
解決策
Controlsの指定方法を変えてみる。
IDを指定してうまくいかなければ、サイズで指定するなど。
コントロールにテキストがある場合、テキストでコントロールを指定する。
(OKボタンなら「OK」というテキストが設定されている場合がある。コントロールにテキストが設定されていない場合も多々ある)
問題
コントロールの情報が分からない
AU3Infoを使っても、情報が出てこない
解決策
Control系関数を使わない
4.4.クリックできない
問題
ControlClickがうまく作動しない
解決策
ControlClickでうまくいかなくても、ControlSendでうまくいく場合がある。
スペースキーは左クリックと同じになる。
ControlClick ( “ウィンドウtitle”, “”, controlID , “left” )
↓
ControlSend ( “ウィンドウtitle”, “”, controlID, “{SPACE}” )
5.コントロールを指定せずに操作する
例えばクリックであれば、
・ウィンドウの左上の位置を取得する。
・ウィンドウにおける、クリックしたい座標を指定し、クリックする。
6.基本メモ
・変数の宣言
Dim $var
varは変数名
数字でも文字列でもなんでもDim
数字と文字列としての数字を区別しない
・コメントの書き方
;の後、行末までがコメント
例
MsgBox (0,””,$fileName );変数fileNameをメッセージボックスで表示する
・条件文
7.デバッグに使える
メッセージボックスで変数の内容を確認する
MsgBox (0,””,$変数名 )
8.便利なスクリプト(デバッグにも使える)
・OKを押さないと次に進まない、キャンセルするとプログラム終了
Dim $check
$check = MsgBox(1,”確認”,”プログラムを続ける場合はOKを押す”);OK,キャンセルの確認
WinWaitClose(“確認”)
If $check == 2 Then ;キャンセルの場合
Exit;プログラム終了
EndIf
・文字列入力ボックス
Dim $input ;入力された文字列を格納する変数
$input = InputBox(“入力”,”文字列を入力”)
WinWaitClose ( “入力”) ;入力完了してから次の命令に進む
If @Error == 1 Then ;キャンセルの場合
Exit;プログラム終了
EndIf
9.正規表現
・StringRegExpでフラグに1を設定すると、一致した文字列の配列が返り値となる(変数ではなく)。
$str = StringRegExp ( “調べる文字列”, “比較する正規表現” ,1 )
MsgBox (0,””,$str[0] ) ;配列strの0番目(最初にマッチした文字列)をメッセージボックスに表示
・正規表現がうまく動作しない場合がある(使い方が間違ってるだけかも)。
|(OR)がおかしい
?(0文字以上繰り返し)がおかしい
{0,1}などもおかしい