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

Nintendo Switch LiteはHDMIで外部出力できるの?前のページ

Live Serverとmkcertで簡単にローカルhttpsサーバーを立ち上げる方法次のページ

関連記事

  1. Office関連

    Officeアプリケーションのバージョン情報ダイアログから情報を取得するVBScript

    自分の手間を減らすためのスクリプトシリーズ、今回はWordやExcel…

  2. Windows 10

    Selenium WebDriverでChromium版Edgeを操作してみました。

    先日書いた下記記事の通り、Chromium版Microsoft Edg…

  3. Office関連

    Excel REST APIをPowerShellから呼び出す方法

    以前Excel REST APIをVBAから呼び出す方法を紹介しました…

  4. Windows 10

    「ファイル名を指定して実行」からMicrosoft Edgeを起動する

    以前書いた記事で、Microsoft EdgeをVBScriptから起…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP