Windowsアプリケーションで3000個のデータを作成するタスクが舞い込んできたわけですが、手作業ではやってられない&毎年発生する業務なので、UWSCのマクロを書き自動化しました。その際に感じた反省点や雑感などをダラダラ書きます。
反省点
Option Explicitを文頭に付けるべきだった。
VBAとかも同じですが、文頭にOption Explicitを書くことで変数宣言を強制でき、可読性の向上が期待できます。
KBD関数を使う時はSENDSTRを使えないか考えるべきだった。
パスワードで英数字を入力する際にKBD関数で仮想キーを送信する方法を最初は考えますが、押すボタンの数だけ行がかさみ可読性が落ちます。
//0を5回入力する(Before)。
KBD(VK_0,click,10)
KBD(VK_0,click,10)
KBD(VK_0,click,10)
KBD(VK_0,click,10)
KBD(VK_0,click,10)
//「;」を使って1行で書けっちゃ書ける。
KBD(VK_0,click,10);KBD(VK_0,click,10);KBD(VK_0,click,10);KBD(VK_0,click,10);KBD(VK_0,click,10);
//0を5回入力する(After)。
SENDSTR(GETID("タイトル名","クラス名"), "00000")
また、KBD関数はWindowのIDを指定できないので、そのとき前面にあるWindowに仮想キーを送信します。KBD関数はあまり使わない方が吉と考えます。
GETID関数で値が帰るタイミングとボタンが入力できるタイミングは一致しない。
当たり前ですが、これを考慮せずにスクリプトを書くと結合テストでエラーが出ます。
//GETIDの第3引数に−1でアプリケーションが起動するまで待つ。
GETID("タイトル名","クラス名",-1)
SLEEP(2)
アプリ起動後にSLEEP関数で2秒くらい待ってあげるとエラーがでる確率が下がります。
画面解像度に依存させるべきでなかった。
画面サイズが1920×1080ならうまく動くけど、より小さいサイズでリモート画面を立ち上げると動かなくなることがあります。録画機能をベースにスクリプトを作成する際、ACW関数でWindowのサイズと位置が操作されますが、これは画面解像度に依存しているので注意が必要です。MOUSEORG関数を使えばアプリを中心に相対座標指定できるらしいです。
TIPS
カレントディレクトリは実行するスクリプト(.uws)の配置場所。
uwsc.exeの格納場所がカレントになると思いこんでましたが、実行するスクリプトを格納するディレクトリがカレントになるみたいです。スクリプト内でEXEを呼び出す際は相対パスで書いてあげると配布しやすくなり、幸せになれますね。
ログオフした状態では仮想キーの送信などができない。
スクリプト実行中にログオフやmstscのリモート接続の切断、最小化をすると、スクリプトは動いているが、仮想キーの送信などの操作がされない状態になります。たしかに、公式サイトにも「BTN, KBD, CHKIMG等」がログオフ状態では使えないと書いてある。プロファイルがアンロードされた状態では画面を操作できないのかな?
使ったツールとか。
Visual Studio2012未満を使っているなら、標準で「Spy++」というツールがダンロードされていると思いますので、そのツールでGETID関数使用時に必要なタイトル名とクラス名を取得できます。Windows SysinternalsのProcess Monitorでも同じような機能が使用可能です。
ウィンドウハンドルに送っているメッセージの中身も確認することができます。
雑感
画像認識について
RPAの醍醐味である画像認識の機能がUWSCにもあります。気になる精度についてですが、悪くないと思いました。簡単なことしかしていませんが、不具合もなく、うまく動いてくれました。
PowerShellとの連携について
PowerShell関数を使えば、PowerShellのスクリプトを直接呼び出すことができます。TEXTBLOCKの中にスクリプトを書くことでファイルを分けずに済みます。ただし、引数にパスを与える時は工夫しなくてはいけないため、骨が折れます。
UWSCが持つ組み込み関数について
以下の点について不満に感じました。
- ウィンドウハンドルに直接メッセージを送る機能がない。
- 一括で取得したWindowsハンドルのIDを返す機能がない。
逆に以下の点はうれしい機能でした。
- ショートカットキーを押下できるSCKEY関数がある。
- GETSLIDERでスクロールバーの状態を確認できる(ただし、SETSLIDERの機能が貧弱)。
やっぱ、UIPathすげー
ライセンスの問題がなければ、UIPathを使いたかった。細かい制御をあまり意識することなく、そこそこな機能が実装できます。UWSCの場合、少し凝った操作をするためにはWindowsの細かい知識(ハンドルとか)が必要になることがあるように思いました。