VBAでUI Automationを使う記事はところどころ見ることが出来ますが、AutoItでもUIAutomation UDFを作ってくださった方がいます。ので、それを早速使ってみます。
使う必要があるかどうかはどういうアプリを操作したいかによるかと思います。細かいコントロール(wordのB太字ボタン)とかを押すとかChromeの設定ボタンを押すとかそういう細かいことを座標ではなくコントロール自体をしっかり操作したい場合に使用するといったところでしょうか。
座標だと使うPCによって解像度が違ったり位置が変わることもあるので。
1. Windows SDKをインストール(任意) Inspectを使う
まずはInspect.exeを使う為にもWindows SDKを入れましょう。コントロールの階層とクラス名など知るのに協力なツールです。どういう風にGUIが作成されているかがわかってしまいます。

C:\Program Files(x86)\Windows Kits\10\bin\10.0.18362.0\x86\inspect.exe

タスクバーとかにでもピン止めして早速起動してみます。
今回は画面キャプチャのScreenPressoで画面キャプチャしようとしたところです。
以下のような感じで詳細がわかります。

マウスカーソルを当たったコントロールの情報まで辿って表示してくれます。
ついでに言うと、デスクトップから開いているウィンドウが全部丸見えになります。
2. UIAUtomation UDF (本題)
junkew氏が作成した IUIAUtomation UDFです。最初のページにjunkew氏が親切に説明を書いているのでそれを読むと良いです。
2.1 最新版のUIA*.zipとexamples*.zipをダウンロードする
2019年12月現在、UIA_V0_70.zip(本体)とEXAMPLES_V0_70.zip(サンプル)があるのでダウンロードして解凍しましょう。
3. UIAの基本は要素を見つけて、アクションする
以下の2つの繰り返しです。要素を見つけるのに次のsimplespy.au3を使うなどします。
- 要素を見つけて変数にセット _UIA_setvar()
- 変数に対してクリックなどのアクション _UIA_action()
3.1 アクションはUIAWrappers.au3 ->_UIA_action()を見る
第2引数の$strActionにはSwitch $strActionに書いてあるのを見ると良いです。
マウス操作は第3引数にx座標、第4引数にy座標という感じです。
クリックの場合はMouseMove()してからMouseClick()してるけど、AutoItの関数ですね。呼ぶ一瞬前に違うウィンドウをカレントにすると多分正しく動作しなくなりますね。
そういう場合はまず_UIA_action($obj,”setfocus”)してから_UIA_action($obj,”click”,x,y)とかすると良いと思います。
4. UIA内のsimplespy.au3を使う
最初にMicrosoft SDKを入れてinspect.exeを使ってと書きましたが、それに近いものがUIA_V0_70内にsimplespy.au3があります。これを実行し、ほしいコントロール上でCtrl+Wを押すことでそのコントロールの情報がテキストとしてコピーされます。(inspect.exeは一定時間毎にカーソルが当たっているところまで辿る:初期設定)
あとは書いているスクリプトに必要な箇所をコピペすれば、そのコントロールを取得できたことになります。10数行目の Standard code maintainable からですね。AutoIt スクリプトは。
試しにWordの太字ボタン上にカーソルを合わせてCtrl+Wするとそのコントロールとその親をsetVar(..)で変数に格納してくれるコードが出てきます。
ついでにclickなどのアクションも追記されるのがいいですね。

;~ *** Standard code maintainable *** #include "UIAWrappers.au3" AutoItSetOption("MustDeclareVars", 1) _UIA_setVar("oP1", "Title:=文書 1 - Word:controltype:=UIA_WindowsContro.... _UIA_setVar("oP2", "Title:=MsoDock Top;controltype:=UIA_PaneControlTypeId; ・・・・ _UIA_setVar("oUIElement","Title:=太字;controltype:=UIA_ButtonControlTypeId;...) ・・・ _UIA_action("oUIElement","highlight") ;~_UIA_action("oUIElement","click")
今回は太字なのでoUIElementにセットされています。
そしてクリックするには_UIA_action(“oUIElement”,…)ですね。
というように、_UIA_setVar()で変数にコントロールをセットし、_UIA_action()でそのコントロールに対してクリックなどのアクションをすることが可能になりました。
5. Exampleからex31_Notepad.au3を見てみる
ex31_Notepad.au3をUIAWrappers.au3などと同じ階層に置いてビルドし実行。
これこのままだと動きません。コントロールがオランダ語、英語なので。日本語に変更しておきましょう。
- Bewerken -> 編集
- Kopi -> コピー
- Plak -> 貼り付け
- Naamloos. -> 無題
- Kladblok -> メモ帳
#include "UIAWrappers.au3" AutoItSetOption("MustDeclareVars", 1) ;~ Start the application run("notepad.exe") Sleep(1000) #REGION UIA_LOGICAL_NAMES ;~ Give logical names ;~ _UIA_setVar("notepad.mainwindow","title:=((Naamloos.*Kladblok)|(.*Notepad));classname:=Notepad") _UIA_setVar("notepad.mainwindow","title:=((.*メモ帳)|(.*Npad));classname:=Notepad") _UIA_setVar("notepad.mainwindow.edit","title:=;classname:=Edit") ;~ When closing when text is changed _UIA_setVar("Notepad.closewindow","title:=((メモ帳)|(Notepad));classname:=#32770") ;~ The three buttons _UIA_setVar("Notepad.closewindow.Save","title:=((Save)|(保存する));classname:=CCPushButton") _UIA_setVar("Notepad.closewindow.Don'tSave","title:=((Don't Save)|(保存しない));classname:=CCPushButton") _UIA_setVar("Notepad.closewindow.Cancel","title:=((Cancel)|(キャンセル));classname:=CCPushButton") #ENDREGION #REGION ACTIONS ;~ Do some actions on the logical named objects _UIA_action("notepad.mainwindow","setfocus") _UIA_action("notepad.mainwindow","move",300,300) _UIA_action("notepad.mainwindow","resize",300,300) _UIA_action("notepad.mainwindow","minimize",300,300) _UIA_action("notepad.mainwindow","maximize",300,300) _UIA_action("notepad.mainwindow","resize",400,400) _UIA_action("notepad.mainwindow.edit","setfocus") _UIA_action("notepad.mainwindow.edit","setvalue","set value: hello world") _UIA_action("notepad.mainwindow.edit","type","type command: hello world") _UIA_action("notepad.mainwindow","close",400,400) if _UIA_action("Notepad.closewindow","exists") Then _UIA_action("Notepad.closewindow.Don'tSave","click") Else EndIf #ENDREGION
日本語に直したサンプル置きました。
5.1 サンプルでやっていること
コードを見ると以下のようになっています。
- run(“notepad.exe”
メモ帳起動しSleep1秒 - 各ウィンドウ、コントロールを取得し変数にセット #REGION UIA_LOGICAL_NAMES
メモ帳ウィンドウとエディットボックス
閉じる時に「保存しますか?」のダイアログと各ボタン - アクション #REGION ACTIONS
メモ帳ウィンドウフォーカス
300,300に移動しリサイズ300,300、最小化、最大化、リサイズ400,400
エディットボックスにフォーカス
hello world を2回、setvalueとtype で入力 - メインウィンドウ閉じる
- 保存するか聞かれるので、そのダイアログが出たら 保存しないをクリック
動作早いので、Actionには行間にSleep(500)とか入れて確認するのが良いかと。
5.2 メモ帳の各コントロールもsimplespyで拾ってみよう
取得したいウィンドウ/コントロール上にマウスカーソルを合わせてCtrl+Wすると取れます。
_UIA_SetVars(“op1″,”..”)とかになりますがまぁ十分でしょう。

これ使いこなせるようになると、Citrixのほうな画像認識必要なもの以外は結構コントロールできそうですね。
6. LarsJ氏のUI Automation UDFのほうが凄い
気軽さは今回の記事のですが、細かいところまで手が届くのは下記のほうです。
コメント