PowerShell

[PowerShell]UI Automationで電卓を操作する方法

「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に限らず、外部のアプリケーション操作は思った以上に大変な処理になりますので、場合によっては運用側で対応することをお薦めします。

関連記事

  1. Office関連

    Excelを使わずにCSVからExcelファイルに変換するPowerShellコード

    CSVファイルからExcelファイルに変換する処理を自動化したい、Ex…

  2. PowerShell

    UI Automation PowerShell Extensionsを試しに使ってみました。

    「d.sunnyone.org: WindowsアプリのUI自動操作を…

  3. Office関連

    PowerShellからNetOfficeを使ってWordやPowerPointを操作する方法

    前回の記事関連で、WordやPowerPointもドンとこいで…

  4. PowerShell

    winmail.datから添付ファイルを取り出すPowerShellコード

    Outlook以外のメールクライアントを使用しているのであれば、一度は…

  5. VBScript

    [クライアント管理]WMI Explorerの紹介

    端末のハードウェア情報やインストールされているソフトウェアなどを調べる…

  6. PowerShell

    [PowerShell]メール送信用関数

    PowerShellを使ってメール送信する機会が増えてきたので、処理を…

コメント

  • コメント (0)

  • トラックバックは利用できません。

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP