Lesson 19

実践5:マウス操作とキーボード操作で、画面操作を自動化する

Lesson 19 Chapter 1
実践5:マウス操作とキーボード操作で、画面操作を自動化する

このレッスンでは、PowerShellを使ってマウス操作やキーボード操作を自動化し、画面操作を自動化する方法について学びます。

画面操作を自動化することで、以下のようなメリットがあります。

  1. 作業の効率化

    マウス操作やキーボード操作を自動化することで、繰り返しの作業を自動化することができます。例えば、同じような手順を何度も繰り返す作業や、大量のファイルを操作する作業などが挙げられます。これらの作業を自動化することで、作業の効率化が図れます。

  2. 作業の正確性の向上

    人間が行うマウス操作やキーボード操作には、誤操作やミスタッチが起こる可能性があります。これに対して自動化ツールを使うことで、正確に同じ操作を繰り返すことができ、作業の正確性が向上します。

  3. 作業の自動化によるストレス低減

    繰り返しの作業や手順の多い作業は、人間にとってストレスを引き起こすことがあります。このような作業を自動化することで、ストレスを低減することができます。

マウス操作やキーボード操作の自動化は、以下のような場面で使用されます。

  • Webページやアプリケーションのテスト
  • Webスクレイピングやデータ収集
  • 定型業務の自動化
  • 業務の繰り返し作業の自動化

これらの場面では、多くの場合、繰り返しの作業や手順の多い作業が行われます。マウス操作やキーボード操作を自動化することで、これらの作業を効率的に処理することができます。また、作業の正確性を向上させたり、ストレスを低減することもできます。

画面操作を自動化する方法はいくつかあります。

  • Windows Automation API
    • 人が画面で行う操作をプログラム的に再現する自動化ツール。Windowsアプリケーションだけでなく、他のプラットフォームにも対応している。

    • Microsoft Active Accessibility(従来のオートメーションツール) と Microsoft UI オートメーション が組み合わさったもの

    • バックグラウンドでの実行に関する制限があり、設定や権限の設定が必要です。

  • UIオートメーション(単体は廃止済み、Windows Automation APIに組み込まれた)
    • 人が画面で行う操作をプログラム的に再現する自動化ツール。Windowsに特化しており、プログラムがWindows Automation APIに比べて簡単になることが多い

    • バックグラウンドでアプリケーションを操作することができます。ただし、アプリケーションによってはバックグラウンドでの実行が制限される場合があり、その場合設定や権限の設定が必要です。

  • Power Automate
    • APIを通じてビジネスプロセスを自動化するために、様々なサービスやアプリケーションとの連携を可能にするノンコーディングの自動化ツール。

    • クラウドベースで実行されるため、バックグラウンドで自動化処理を実行することができる。

  • SendKeys メソッド
    • SendKeyメソッドは、UIオートメーションで使用される一般的なメソッドの1つであり、特定のキーストローク(例えば、"Ctrl+C"、"Alt+F4"など)を送信してアプリケーションの操作を自動化します。

    • 操作をシミュレートするため、バックグラウンドでの実行はできません。

以下は、Windows Automation APIを使って画面操作を自動化するスクリプト例です。

AutoCalculator.ps1
# [1] Windows Automation APIに必要なクラスをインポート
$uiAuto = [Windows.Automation.AutomationElement]
$tree = [Windows.Automation.TreeScope]
$pcnd = [Windows.Automation.PropertyCondition]
$acnd = [Windows.Automation.AndCondition]
$iptn = [Windows.Automation.InvokePattern]::Pattern
$root = $uiAuto::RootElement
 
# [2] 計算機アプリを起動する
Start-Process "calc"
$elmApp = $null

# [3] 計算機アプリのAutomationElementを取得するための条件を設定する
$cndAppName = New-Object $pcnd($uiAuto::NameProperty, "電卓")
$cndAppClassName = New-Object $pcnd($uiAuto::ClassNameProperty, "ApplicationFrameWindow")
$cndAppAnd = New-Object $acnd($cndAppName, $cndAppClassName)
# [4] 電卓が起動するまで待つ
do{
  Start-Sleep -m 200
  # 計算機アプリのAutomationElementを取得する
  $elmApp = $root.FindFirst($tree::Children, $cndAppAnd)
}while($null -eq $elmApp)

Start-Sleep -m 200

 
# [5] [1-9]ボタンを順番にクリックする
for($i=1; $i -le 9; $i++){
  $cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "num${i}Button")
  $elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)

  if ($null -eq $elmBtn) {
      Write-Error "Button num${i}Button not found"
  } else {
    # ボタンをクリックする
      $ivkBtn = $elmBtn.GetCurrentPattern($iptn)
      $ivkBtn.Invoke()
      Start-Sleep -Milliseconds 200 #動作確認しやすいようにSleep
  }
}
# [6] マイナスボタンをクリックする
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "minusButton")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()
 
# [7] 引き算を行うために[1][0][0][0][0][0][0][0]を入力する
$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()
 
# [8] [=]ボタンをクリックする
$cndBtnAid = New-Object $pcnd($uiAuto::AutomationIdProperty, "equalButton")
$elmBtn = $elmApp.FindFirst($tree::Subtree, $cndBtnAid)
$ivkBtn = $elmBtn.GetCurrentPattern($iptn)
$ivkBtn.Invoke()

# [9] 結果を標準出力
$cndResult = New-Object $pcnd($uiAuto::AutomationIdProperty, "CalculatorResults")
$elmResult = $elmApp.FindFirst($tree::Subtree, $cndResult)
# Resultオブジェクトの取得
$resultObject = $elmResult.GetCurrentPropertyValue([Windows.Automation.AutomationElement]::NameProperty)
# Resultオブジェクトから計算結果を取得
$resultText = $resultObject.Substring($resultObject.IndexOf("=") + 5)
# 計算結果の出力
Write-Host "結果は $resultText"