~UI Automationで画面操作捕捉!その1~ UI Automation with PowerShell 奮戦記 4日目

UI Automation*1で遊ぼう!

UI Automation の画面操作の捕捉機能を使用した画面ハードコピーの自動化に挑戦しています。Windowsの標準実装のみ、PowerShellのみで動作させることを目指しています。

UI Automationというと
「画面の操作が出来る」
が最初に浮かんでくると思いますが
画面の操作のイベントを取得することも出来ます。
自動画面ハードコピーも作れますね。

PowerShellUI Automationのイベント取得が出来るか
確認していきたいと思います。

まずPowerShellで可能な以下のイベント取得を確認してみます。

  • Windows Formでのイベント取得(ボタンクリック)
  • Register-ObjectEventでのイベント取得(タイマー)

Windows Formでのイベント取得(ボタンクリック)
PowerShell Version2(管理者権限)で実行してみる。

# Windows Form を組み込む
Add-Type -AssemblyName System.Windows.Forms

# コントロール作成
$form = New-Object System.Windows.Forms.Form
$button = New-Object System.Windows.Forms.Button
$button.Text = "click !!"
$form.Controls.Add($button)

# ボタンクリックイベント
$button.Add_Click({Write-Host "click !!"})

# フォーム表示
$form.ShowDialog()

実行結果

f:id:amon52280:20181210200246p:plainf:id:amon52280:20181210200215p:plain
Windows Form でマウスクリックイベント

Register-ObjectEventでのイベント取得(タイマー)
PowerShell Version2(管理者権限)で実行してみる。

# タイマーを組み込む
$timer = New-Object System.Timers.Timer

# タイマー間隔
$timer.Interval = 2000

# タイマーイベント
Register-ObjectEvent -InputObject $timer -EventName Elapsed -Action {Write-Host "timer !!"} | Out-Null

# タイマースタート
$timer.Enabled = $true

実行結果

timer !!
timer !!
timer !!
timer !!
timer !!

これらWindows Forms,TimerはオブジェクトにEventタイプがある為、PowerShellよりイベントを取得出来ます。

Name     MemberType Definition
Click       Event        System.EventHandler Click(System.Object, System.EventArgs)
Name     MemberType Definition
Elapsed  Event        System.Timers.ElapsedEventHandler Elapsed(System.Object, System.Timers.ElapsedEventArgs)

UI Automationはどうでしょう。

Name     MemberType Definition
AddAutomationEventHandler                   Method     static void AddAutomationEventHandler(System.Windows.Automati...
AddAutomationFocusChangedEventHandler       Method     static void AddAutomationFocusChangedEventHandler(System.Wind...
AddAutomationPropertyChangedEventHandler    Method     static void AddAutomationPropertyChangedEventHandler(System.W...
AddStructureChangedEventHandler             Method     static void AddStructureChangedEventHandler(System.Windows.Au...

メソッドで公開しています。
EventタイプでPowerShellに公開する為、Net Frameworkで実装するしかなさそうです。

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