AUtoItでUIA ( UI Automation )を使う その1

autoit uiautomation AutoIT

VBAでUI Automationを使う記事はところどころ見ることが出来ますが、AutoItでもUIAutomation UDFを作ってくださった方がいます。ので、それを早速使ってみます。
使う必要があるかどうかはどういうアプリを操作したいかによるかと思います。細かいコントロール(wordのB太字ボタン)とかを押すとかChromeの設定ボタンを押すとかそういう細かいことを座標ではなくコントロール自体をしっかり操作したい場合に使用するといったところでしょうか。
座標だと使うPCによって解像度が違ったり位置が変わることもあるので。

スポンサーリンク

1. Windows SDKをインストール(任意) Inspectを使う

まずはInspect.exeを使う為にもWindows SDKを入れましょう。コントロールの階層とクラス名など知るのに協力なツールです。どういう風にGUIが作成されているかがわかってしまいます。

Windows 10 SDK – Windows アプリ開発
Windows SDK for Windows 10 には、Windows 上で動作するアプリの作成&#261...

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

inspect exeはWindows SDKをインストールしたら使える

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

inspect exeでキャプチャすると画像のようになります

マウスカーソルを当たったコントロールの情報まで辿って表示してくれます。
ついでに言うと、デスクトップから開いているウィンドウが全部丸見えになります。

2. UIAUtomation UDF (本題)

junkew氏が作成した IUIAUtomation UDFです。最初のページにjunkew氏が親切に説明を書いているのでそれを読むと良いです。

IUIAutomation MS framework automate chrome, FF, IE, ....
Automate all windows and browser applications with one UDF function library. Based on the microsoft automation API this library high level supports Recognition ...

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などのアクションも追記されるのがいいですね。

simplyspyでwordの太字ボタンコントロールを取得してみる
;~ *** 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

日本語に直したサンプル置きました。

cfautog/autoit
sample code. Contribute to cfautog/autoit development by creating an account on GitHub.

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″,”..”)とかになりますがまぁ十分でしょう。

autoit uiautomation simplespyでメモ帳のコントロールを取得

これ使いこなせるようになると、Citrixのほうな画像認識必要なもの以外は結構コントロールできそうですね。

6. LarsJ氏のUI Automation UDFのほうが凄い

気軽さは今回の記事のですが、細かいところまで手が届くのは下記のほうです。

コメント

タイトルとURLをコピーしました