PMPの流儀

PMPの流儀

エンジニアのページ。主にPC関係で便利な事を中心に記事を書いています。

MENU

PowerShell UIAutomation Extensionsでアプリを操作(オートメーション)

アプリケーションのウインドウ操作は分かりすく使いやすいですが、同じ作業を何度もやるのは苦痛です。Excelのようにオートメーション機能があるものは限られています。今回は PowerShell から、Win32アプリケーションを操作(オートメーション)する方法を紹介します。

 

概要

.Net Framework には UI Automation というライブラリがあり、ウインドウの操作をC#から利用できます。記述するときはカットアンドトライになり、いちいち記述してコンパイルする手間が面倒なので、言語はPowerShellの方が向いています。 .Net Framework を利用できるので当然その恩恵にあずかれるのですが、いかんせん使いにくい。

PowerShell からオートメーションを簡単に使うために開発された UI Automation Extensions というフリーウェアがあります。これを使用するとオートメーション化が容易になります。

ダウンロード

すでに開発が終了しているようです。閉鎖される前に入手しておいた方が良いです。

pmp-style.hatenablog.com

以下の2つをダウンロードします。
UIAutomation.0.8.7B3.NET40.zip
UIAutomation.0.8.7B3.samples.zip

サンプルの方は呼び方の参考になります。

使い方

「電卓」のオートメーションを試してみましょう。

事前に、上記ライブラリ (UIAutomation.0.8.7B3.NET40.zip) をスクリプトの直下に展開しておきます。
完成したソースコードを示します。

Import-Module .\UIAutomation.0.8.7B3.NET40\UIAutomation.dll
[UIAutomation.Preferences]::Highlight=$false

Start-Process calc
$win = Get-UiaWindow -Name '電卓'
$win | Get-UiaButton -Name '3' | Invoke-UiaButtonClick | Out-Null
$win | Get-UiaButton -Name 'プラス' | Invoke-UiaButtonClick | Out-Null
$win | Get-UiaButton -Name '4' | Invoke-UiaButtonClick | Out-Null
$win | Get-UiaButton -Name '等号' | Invoke-UiaButtonClick | Out-Null

パイプを使った PowerShell らしい記述が可能です。直感的に理解できると思います。
しかし、3とか4はともかく、「プラス」や「等号」という名前はどうやって知るのでしょうか。

ここで神ツールの登場です。

UIAutomationExライブラリの中に入っている "UIAutomationSpy.exe" を起動し、「Start」ボタンを押します。
すると、知りたい場所にマウスカーソルを持っていくと、そのエリアのオブジェクトに赤枠が付きスクリプトが表示されます。
知りたい情報が表示されたら素早く「Stop」ボタンを押します。もたもたしていると内容が書き換わってしまいます。

f:id:ruruucky:20201123005254p:plain

「Write code to clipboard」にチェックを入れておけばスクリプトクリップボードに格納されますので、それをコピペすれば簡単に書けます。

今回はボタンだけでしたが、メニューやテキストボックスやキー入力など道具がそろっているのでそれを組み合わせれば多くのアプリの操作ができるようになります。

制限事項

ほとんど万能ですができないことがあり、簡単と思って始めたオートメーションが深みにはまってしまうケースもあります。

Spyを使ってそのオブジェクト自体を取得できない場合、たとえば表示された数字を知りたいが、テキストではなくBMPとして表示されている場合はダメです。

・何か処理をして終わったら次の動作に移る場合に、オブジェクトに変化(ボタンが無効から有効に変化する等)があれば監視することができますが、何も変化がない場合、処理が終わったことを検知することができません。その場合は、処理時間が決まっていれば Sleep を入れるか、そのアプリのCPU使用率を調べるなど他の手段で完了したことを検知する必要があります。これについてはまたの機会に紹介します。

最後に

もし会社でアプリケーションの定型作業があればオートメーション化による工数削減目標を立てましょう。その際は簡単に実現性を確認しておくことは忘れずに。