「PowerShell UI Automation 操作」といったキーワード検索からのアクセスがありました。
PowerShellで何かしらのアプリケーションを操作したい方だと思います。
対象となるアプリケーションが何なのか分かりませんが、一例として、「電卓」を操作するコードを書いてみました。
Add-Type -AssemblyName "UIAutomationClient"
Add-Type -AssemblyName "UIAutomationTypes"
$uiAuto = [Windows.Automation.AutomationElement]
$tree = [Windows.Automation.TreeScope]
$pcnd = [Windows.Automation.PropertyCondition]
$acnd = [Windows.Automation.AndCondition]
$iptn = [Windows.Automation.InvokePattern]::Pattern
$root = $uiAuto::RootElement
#電卓起動
start "calc"
$elmApp = $null
$cndAppName = New-Object $pcnd($uiAuto::NameProperty, "電卓")
$cndAppClassName = New-Object $pcnd($uiAuto::ClassNameProperty, "ApplicationFrameWindow")
$cndAppAnd = New-Object $acnd($cndAppName, $cndAppClassName)
do{
Start-Sleep -m 200
$elmApp = $root.FindFirst($tree::Children, $cndAppAnd)
}while($elmApp -eq $null)
#ナビゲーションを開く
$elmNav = $null
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "TogglePaneButton")
$cndNavAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "PaneRoot")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
do{
$ivkBtn.Invoke()
Start-Sleep -m 200
$elmNav = $elmApp.FindFirst($tree::Subtree, $cndNavAid)
}while($elmNav -eq $null)
#ナビゲーション項目列挙
$cndItmClassName = New-Object $pcnd($uiAuto::ClassNameProperty, "ListViewItem")
foreach($itm in $elmNav.FindAll($tree::Subtree, $cndItmClassName)){
$itm.Current.Name
}
#[標準]押下
$cndItmAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "Standard")
$elmItm = $elmNav.FindFirst($tree::Subtree, $cndItmAid)
$ivkItm = $elmItm.GetCurrentPattern($iptn)
$ivkItm.Invoke()
#[1-9]ボタン押下
for($i=1; $i -le 9; $i++){
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num${i}Button")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()
Start-Sleep -m 200 #動作確認しやすいようにSleep
}
#[-]ボタン押下
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "minusButton")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()
#適当に引き算
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num1Button")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num0Button")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke()
$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke();$ivkBtn.Invoke()
#[=]ボタン押下
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "equalButton")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()
大まかには上記のようなコードでアプリケーションを操作できますが、古いWin32アプリケーションの場合は下記サイトのような問題もあるようです。
UI Automationに限らず、外部のアプリケーション操作は思った以上に大変な処理になりますので、場合によっては運用側で対応することをお薦めします。




















この記事へのコメントはありません。