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. PowerShell

    SlackのメッセージをCSVファイルとして保存するPowerShellスクリプト

    数日前、今年の9月1日からSlackのフリープランではメッセージ履歴が…

  2. Office関連

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

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

  3. Office関連

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

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

  4. PowerShell

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

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

  5. PowerShell

    [PowerShell]メール送信用関数

    本記事で使用しているSmtpClientは2018年現在非推奨となって…

  6. PowerShell

    [PowerShell]iTextSharpを使ってPDFファイルのページ数を取得する

    前回の記事では、VBAでAdobe ReaderからPDFファイルのペ…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP