~UI Automationで画面操作捕捉!その3~ UI Automation with PowerShell 奮戦記 6日目
UI Automation*1で遊ぼう!
UI Automation の画面操作の捕捉機能を使用した画面ハードコピーの自動化に挑戦しています。Windowsの標準実装のみ、PowerShellのみで動作させることを目指しています。
UI Automationでの画面操作の捕捉をPowerShellで出来るようにEventタイプを.Net Framworkで実装しました。
実装した開発ライブラリ、共通で使用するスクリプトについては以下を確認してくださいね。
https://amon52280sub.hateblo.jp/entry/2019/01/23/032420
ウインドウオープンのイベントを実装してみました。
またマウスで移動中にフォーカス移動が連続発生するのを抑止する為、タイマーで制御しました。
PowerShell Version3(管理者権限)で実行してみる。
# UI Automation 共通ファンクションを組み込む . .\UIA.ps1 # 初期化 $uia = UIA_Init # Timer イベント捕捉 $global:timer = New-Object System.Timers.Timer $timer.Interval = 100 $timer.Enabled = $false Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action { try { $name = $ev[0].current.name $controltype = $ev[0].current.localizedcontroltype $classname = $ev[0].current.classname $eventid = $ev[1].EventId.ProgrammaticName Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String) $timer.Enabled = $false } catch { Write-Host $_ } } | Out-Null # UI AUtomation イベント捕捉 Register-ObjectEvent -InputObject $uia -EventName UIChange -Action { try { $timer.Enabled = $false $global:ev = $args $name = $args[0].current.name $controltype = $args[0].current.localizedcontroltype $classname = $args[0].current.classname $eventid = $args[1].EventId.ProgrammaticName switch ($eventid) { ("AutomationElementIdentifiers.AutomationFocusChangedEvent") { $timer.Interval = 1000 $timer.Enabled = $true } ("WindowPatternIdentifiers.WindowOpenedProperty"){ Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String) $timer.Interval = 1000 $timer.Enabled = $false } default { Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String) $timer.Interval = 1000 $timer.Enabled = $false } } } catch { Write-Host $_ } } | Out-Null # イベントスタート $uia.StartEvent()
これでほぼ上手くいくのですが次のパターンだと最新のタイミングが取得出来ません。
ControlType ClassName EventID Name ----------- --------- ------- ---- コンボ ボックス ComboBox AutomationElementIdentifiers.AutomationFocusChangedEvent エクスプローラーで開く: ControlType ClassName EventID Name ----------- --------- ------- ---- チェック ボックス Button AutomationElementIdentifiers.AutomationFocusChangedEvent 最近使ったファイルをクイック アク セスに表示する
最後の操作が表示出来ていませんね。このようなイベントも実装していきたいと思います。