~UI Automationで画面情報取得!その1~ UI Automation with PowerShell 奮戦記 9日目

UI Automation*1で遊ぼう!

UI Automation の画面情報の取得機能を使用したWindows設定書生成の自動化に挑戦しています。Windowsの標準実装のみ、PowerShellのみで動作させることを目指しています。

UI Automationでの画面操作の捕捉をPowerShellで出来るようにEventタイプを.Net Framworkで実装しました。
実装した開発ライブラリ、共通で使用するスクリプトについては以下を確認してくださいね。
https://amon52280sub.hateblo.jp/entry/2019/01/23/032420


画面情報を取得してみましょう。
PowerShell Version3(管理者権限)で実行してみる。

[CmdletBinding()]
Param (
  [int]$global:delay = 500
)

# UI Automation 共通ファンクションを組み込む
. .\UIA.ps1

# 初期化
$global: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

  # ウインドウ or ダイアログ 
  $p = UIA_GetParentElement $ev[0]
  Write-Host $($p | Out-String)
  Write-Host ($p -ne $null)
  if ($p -ne $null) {
    Write-Host $(UIA_GetElements $p $subtree | UIA_OutPut | Out-String)
  }
  Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String)
  Write-Host $($ev[0].GetSupportedPatterns() | 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 = $ev[0].current.name
  $controltype = $ev[0].current.localizedcontroltype
  $classname = $ev[0].current.classname
  $eventid = $ev[1].EventId.ProgrammaticName

  if ($name -match "powershell") {return}
  switch ($eventid) {
    "AutomationElementIdentifiers.AutomationFocusChangedEvent" {
      $uia.SetEvent($ev[0])
      $timer.Interval = $delay
      $timer.Enabled = $true
    }
    "AutomationElementIdentifiers.AutomationPropertyChangedEvent" {
      $timer.Interval = $delay
      $timer.Enabled = $false
    }
    "WindowPatternIdentifiers.WindowOpenedProperty"{
      Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String)
      Write-Host $(UIA_GetElements $ev[0] $subtree | UIA_OutPut | Out-String)
      $timer.Interval = $delay
      $timer.Enabled = $false
    }
    default {
      Write-Host $(UIA_OutPut -element $ev[0] -event $ev[1] -mode Event | Out-String)
      $timer.Interval = $delay
      $timer.Enabled = $false
    }
  }
  } catch {
    Write-Host $_
  }  
} | Out-Null

# イベントスタート
$uia.StartEvent()
"画面情報取得スタート!!"

実行結果

f:id:amon52280:20181203235901p:plainf:id:amon52280:20181203235718p:plain
システムのプロパティ画面を取得

ControlType ClassName EventID                                       Name
ダイアログ       #32770    WindowPatternIdentifiers.WindowOpenedProperty システムのプロパティ




LocalizedControlType ClassName       Name
ダイアログ                #32770          システムのプロパティ
ボタン                  Button          OK
ボタン                  Button          キャンセル
ボタン                  Button          適用(A)
タブ                   SysTabControl32
タブ項目                                 コンピューター名
タブ項目                                 ハードウェア
タブ項目                                 詳細設定
テキスト                 Static          Administrator としてログオンしない場合は、これらのほとんどは変更できません。
グループ                 Button          パフォーマンス
テキスト                 Static          視覚効果、プロセッサのスケジュール、メモリ使用、および仮想メモリ
ボタン                  Button          設定(S)...
グループ                 Button          ユーザー プロファイル
テキスト                 Static          サインインに関連したデスクトップ設定
ボタン                  Button          設定(E)...
グループ                 Button          起動と回復
テキスト                 Static          システム起動、システム障害、およびデバッグ情報
ボタン                  Button          設定(T)
ボタン                  Button          環境変数(N)...
タブ項目                                 システムの保護
タブ項目                                 リモート
タイトル バー                              システムのプロパティ
メニュー バー                              システム メニュー バー
メニュー項目                               システム
ボタン                                  閉じる



PS D:\開発\09DAY> UIA_GetParentElement

LocalizedControlType ClassName Name
タブ項目                           コンピューター名



UIA_GetParentElement

LocalizedControlType ClassName       Name
タブ                   SysTabControl32



UIA_GetParentElement

LocalizedControlType ClassName Name
ダイアログ                #32770    システムのプロパティ




Cached                                                                   Current
System.Windows.Automation.AutomationElement+AutomationElementInformation System.Windows.Automation.AutomationElement...



True

LocalizedControlType ClassName       Name
ダイアログ                #32770          システムのプロパティ
ボタン                  Button          OK
ボタン                  Button          キャンセル
ボタン                  Button          適用(A)
タブ                   SysTabControl32
タブ項目                                 コンピューター名
テキスト                 Static          コンピューターの説明(D):
編集                   Edit            コンピューターの説明(D):
テキスト                 Static          例: "キッチンのコンピューター"、"仕事用コンピューター"
テキスト                 Static          フル コンピューター名:
編集                   Edit            フル コンピューター名:
テキスト                 Static          ワークグループ:
編集                   Edit            ワークグループ:
テキスト                 Static          ドメインまたはワークグループに参加するためのウィザードを使用するには [ネットワーク
ID] をクリックしてください。
ボタン                  Button          ネットワーク ID(N)...
テキスト                 Static          このコンピューターの名前を変更するには、[変更] をクリックしてください。

ボタン                  Button          変更(C)...
テキスト                 Static
イメージ                 Static
テキスト                 Static          次の情報は、このコンピューターをネットワーク上で識別するために使われます。

タブ項目                                 ハードウェア
タブ項目                                 詳細設定
タブ項目                                 システムの保護
タブ項目                                 リモート
タイトル バー                              システムのプロパティ
メニュー バー                              システム メニュー バー
メニュー項目                               システム
ボタン                                  閉じる




ControlType ClassName EventID                                                  Name
編集          Edit      AutomationElementIdentifiers.AutomationFocusChangedEvent コンピューターの説明(D):




   Id ProgrammaticName
10002 ValuePatternIdentifiers.Pattern
10014 TextPatternIdentifiers.Pattern

取得出来てますね。親子関係の構造を見やすくしていきましょう。

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

~UI Automationって動くの?その4~ UI Automation with PowerShell 奮戦記 8日目

UI Automation*1で遊ぼう!

UI Automationって動くの? まとめてみる。


PowerShellの動作環境

以下の環境で動作確認出来ています。

- OSのUACを無効にする。
- PowerShellを管理者権限で実行する。
- PowerShellスクリプト実行を有効にする。
- Version 2(or 3)で実行する。


  

スクリプトを作るにあたって注意すること

以下の追加処理がないと正しい値が取得出来ません。

# UI Automation を組み込む
Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes
 .Net Frameworkプログラムで
 elmentのrootを取得するメソッドを作成
 そのメソッドを呼び出す
例:
Import-Module .\MyUIAutomation20.dll
# 不具合回避
[MyUIAutomation.UIAAutomation]::GetRoot() | Out-Null

 

UI Automationのイベントについて

以下のイベントの動作不可を確認しています。

〇AddAutomationFocusChangedEventHandler
〇AddAutomationEventHandler
〇AddAutomationPropertyChangedEventHandler
〇AddStructureChangedEventHandler

 

また判明次第追記します。

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

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

UI Automation*1で遊ぼう!

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

UI Automationでの画面操作の捕捉をPowerShellで出来るようにEventタイプを.Net Framworkで実装しました。
実装した開発ライブラリ、共通で使用するスクリプトについては以下を確認してくださいね。
https://amon52280sub.hateblo.jp/entry/2019/01/23/032420


前回の操作パターンでの問題はイベント追加実装で解決。
開発ライブラリの$uia.SetEvent($ev[0])の中でプロパティ変更のイベント登録を実行しています。
PowerShell Version3(管理者権限)で実行してみる。

# UI Automation 共通ファンクションを組み込む
. .\UIA.ps1

# 初期化
$global: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 = $ev[0].current.name
  $controltype = $ev[0].current.localizedcontroltype
  $classname = $ev[0].current.classname
  $eventid = $ev[1].EventId.ProgrammaticName

  if ($name -match "powershell") {return}
  switch ($eventid) {
    ("AutomationElementIdentifiers.AutomationFocusChangedEvent") {
      $uia.SetEvent($ev[0])
      $timer.Interval = 1000
      $timer.Enabled = $true
    }
    ("AutomationElementIdentifiers.AutomationPropertyChangedEvent") {
      $uia.SetEvent($ev[0])
      $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
    }
    ("WindowPatternIdentifiers.WindowClosedProperty"){
      $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   : ComboBox
EventID     : AutomationElementIdentifiers.AutomationFocusChangedEvent
Property    :
Name        : エクスプローラーで開く:


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


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

このパターンでも

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

実行結果

ControlType : ボタン
ClassName   : Button
EventID     : AutomationElementIdentifiers.AutomationFocusChangedEvent
Property    :
Name        : フォルダーに適用(L)


ControlType : ツリー項目
ClassName   :
EventID     : AutomationElementIdentifiers.AutomationFocusChangedEvent
Property    :
Name        : すべてのフォルダーを表示


ControlType : ツリー項目
ClassName   :
EventID     : AutomationElementIdentifiers.AutomationPropertyChangedEvent
Property    : AutomationElementIdentifiers.NameProperty
Name        : すべてのフォルダーを表示

操作を認識出来ていますね。

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

~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のことです

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

UI Automation*1で遊ぼう!

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

UI Automationでの画面操作の捕捉をPowerShellで出来るようにEventタイプを.Net Framworkで実装しました。
実装した開発ライブラリ、共通で使用するスクリプトについては以下を確認してくださいね。
https://amon52280sub.hateblo.jp/entry/2019/01/23/032420


フォーカス移動のイベントを実装してみました。
$uia.StartEvent()の中でフォーカス移動イベントの登録を実行しています。
PowerShell Version3(管理者権限)で実行してみる。

# UI Automation 共通ファンクションを組み込む
. .\UIA.ps1

# 初期化
$uia = UIA_Init

# UI AUtomation イベント捕捉
Register-ObjectEvent -InputObject $uia -EventName UIChange -Action {
  Write-Host $args[0].current.name
}

# イベントスタート
$uia.StartEvent()

実行結果

テキスト エディター
ファイル(F)
編集(E)
書式(O)
表示(V)
ヘルプ(H)

フォーカスが移動するたび表示しますね。他のイベントも実装していきたいと思います。

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

~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のことです

~UI Automationって動くの?その3~ UI Automation with PowerShell 奮戦記 3日目

UI Automation*1で遊ぼう!

タブが出てこない件ですが
ちまたでの議論どおり

  • PowerShellをバージョン2で実行する
  • 管理者権限で実行する
  • メニューバーを取得できない現象回避

で解決できそうです。
一覧、コントロールタイプの取得での誤動作が直ります。

では、「コンピュータ名」のとこの画面を表示してみましょう。

f:id:amon52280:20181203235901p:plainf:id:amon52280:20181203235718p:plain
システムのプロパティで「コンピュータ名」タブをクリック

まず、システムのプロパティ画面の構成を表示してみましょう。
PowerShell Version2(管理者権限)で実行してみる。

# START 不具合回避 (メニューバーを取得できない現象)
function LoadUIAutomationHelper
{ 
    $source = 
@" 
        using System.Windows.Automation;
        namespace UIAutomationHelper 
        { 
            public class UIAElement 
            { 
                public static AutomationElement GetRoot() 
                { 
                    return AutomationElement.RootElement; 
                } 
            } 
        }  
"@ 
    # [Note] Add-Type -Language CSharp -TypeDefinition ○○ -ReferencedAssemblies(□□) ... 参照設定(□□)でC#コードの○○をコンパイル
    Add-Type -Language CSharp -TypeDefinition $source -ReferencedAssemblies( "UIAutomationClient", "UIAutomationTypes")
    [UIAutomationHelper.UIAElement]::GetRoot()
}
 
# UI Automation を組み込む
Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes

# 不具合回避
$n=LoadUIAutomationHelper 

# システムのプロパティを表示
SystemPropertiesAdvanced.exe

# ルートエレメント
$re = [System.Windows.Automation.AutomationElement]::RootElement

$subtree = [System.Windows.Automation.TreeScope]::Subtree
$condition_true = [System.Windows.Automation.Condition]::TrueCondition

# システムのプロパティ画面の構成
$syse = $re.FindAll($subtree,$condition_true) | ?{($_.current.name -eq "システムのプロパティ")} | ?{$_.current.localizedcontroltype -eq "ダイアログ"}
$syse | %{$_.FindAll($subtree,$condition_true)} | %{$_.current} | select name,localizedcontroltype

実行結果

Name                                                        LocalizedControlType
システムのプロパティ                                        ダイアログ
OK                                                          ボタン
キャンセル                                                  ボタン
適用(A)                                                     ボタン
                                                            タブ
コンピューター名                                            タブ項目
ハードウェア                                                タブ項目
詳細設定                                                    タブ項目
Administrator としてログオンしない場合は、これらのほとん... テキスト
パフォーマンス                                              グループ
視覚効果、プロセッサのスケジュール、メモリ使用、および仮... テキスト
設定(S)...                                                  ボタン
ユーザー プロファイル                                       グループ
サインインに関連したデスクトップ設定                        テキスト
設定(E)...                                                  ボタン
起動と回復                                                  グループ
システム起動、システム障害、およびデバッグ情報              テキスト
設定(T)                                                     ボタン
環境変数(N)...                                              ボタン
システムの保護                                              タブ項目
リモート                                                    タブ項目
システムのプロパティ                                        タイトル バー
システム メニュー バー                                      メニュー バー
システム                                                    メニュー項目
閉じる                                                      ボタン
システムのプロパティ                                        タイトル バー
システム メニュー バー                                      メニュー バー
システム                                                    メニュー項目
閉じる                                                      ボタン
コンピューター名                                            タブ項目

正しく表示出来ました。

次に「コンピュータ名」タブをクリックします。

# 「コンピューター名」タブをクリック
$cmpe = $syse | %{$_.FindAll($subtree,$condition_true)} | ?{$_.current.name -eq "コンピューター名"} | ?{$_.current.localizedcontroltype -eq "タブ項目"}
$cmpe |  %{$_.current} | select name,localizedcontroltype
$cmpp = $cmpe.GetCurrentPattern([System.Windows.Automation.SelectionItemPattern]::Pattern)
$cmpp.Select()
""
$syse | %{$_.FindAll($subtree,$condition_true)} | %{$_.current} | select name,localizedcontroltype

実行結果

システムのプロパティ                                        ダイアログ
OK                                                          ボタン
キャンセル                                                  ボタン
適用(A)                                                     ボタン
                                                            タブ
コンピューター名                                            タブ項目
コンピューターの説明(D):                                    テキスト
コンピューターの説明(D):                                    編集
例: "キッチンのコンピューター"、"仕事用コンピューター"      テキスト
フル コンピューター名:                                      テキスト
フル コンピューター名:                                      編集
ワークグループ:                                             テキスト
ワークグループ:                                             編集
ドメインまたはワークグループに参加するためのウィザードを... テキスト
ネットワーク ID(N)...                                       ボタン
このコンピューターの名前を変更するには、[変更] をクリッ...  テキスト
変更(C)...                                                  ボタン
このコンピューターの名前を変更するには、[変更] をクリッ...  テキスト
                                                            イメージ
次の情報は、このコンピューターをネットワーク上で識別する... テキスト
ハードウェア                                                タブ項目
詳細設定                                                    タブ項目
システムの保護                                              タブ項目
リモート                                                    タブ項目
システムのプロパティ                                        タイトル バー
システム メニュー バー                                      メニュー バー
システム                                                    メニュー項目
閉じる                                                      ボタン

ちゃんと動きますね。

参考:
UI Automationを利用したアプリケーション操作 [Powershell] : スクリプトちょっとメモ

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