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