~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()

これでほぼ上手くいくのですが次のパターンだと最新のタイミングが取得出来ません。

f:id:amon52280:20181215200937p:plainf:id:amon52280:20181215200940p:plainf:id:amon52280:20181215200944p:plain
フォルダーオプションを操作してみる

ControlType ClassName EventID                                                  Name
 ----------- --------- -------                                                  ----
コンボ ボックス    ComboBox  AutomationElementIdentifiers.AutomationFocusChangedEvent エクスプローラーで開く:


ControlType ClassName EventID                                                  Name
 ----------- --------- -------                                                  ----
チェック ボックス   Button    AutomationElementIdentifiers.AutomationFocusChangedEvent 最近使ったファイルをクイック アク
セスに表示する

最後の操作が表示出来ていませんね。このようなイベントも実装していきたいと思います。

*1:ここでのUI AutomationはSystem.Windows.Automationのことです