PowerShellでUI Automationを使い、マウスオーバー中の要素情報を取得する方法

Windows環境で「いまマウスカーソルが乗っているUI要素の情報」を取得したいケースがあります。例えば、ブラウザ上でリンクにマウスオーバーしているときに、その要素のテキストやヒント情報を取得したい場合です。

ここでは UI Automation API をPowerShellから利用して、カーソル直下の要素を定期的に取得・表示する方法を紹介します。


手順概要

  1. UI Automationを使えるようにする

PresentationCore / PresentationFramework / WindowsBase / UIAutomationClient を読み込みます。

  1. カーソル座標を取得する

user32.dll の GetCursorPos を呼び出し、スクリーン上のカーソル位置を取得します。

  1. その座標からAutomationElementを取得

AutomationElement.FromPoint() を使うことで、UI Automation要素を取得できます。

  1. 要素の情報を表示する

ControlType(ボタン、テキストなど)

Name(ユーザーに見えるラベルやテキスト)

HelpText(ヒントや追加情報)

LegacyIAccessible.Value(古いアプリで使われる値。URLなどが入ることもある)


実際のコード

以下のコードをPowerShellコンソールに貼り付けて実行すると、マウスを動かすたびにカーソル下の要素情報が出力されます。

Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,UIAutomationClient

# Win32 APIでカーソル座標を取得するための宣言
Add-Type @"
using System;
using System.Runtime.InteropServices;
public static class Native {
  [DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT lpPoint);
  public struct POINT { public int X; public int Y; }
}
"@

function Get-ElementUnderCursor {
  $pt = New-Object Native+POINT
  [Native]::GetCursorPos([ref]$pt) | Out-Null
  $sysPt = New-Object System.Windows.Point($pt.X, $pt.Y)
  [System.Windows.Automation.AutomationElement]::FromPoint($sysPt)
}

$lastRuntimeId = $null
while ($true) {
  $el = Get-ElementUnderCursor
  if ($el) {
    $id = ($el.GetRuntimeId() -join '.')
    if ($id -ne $lastRuntimeId) {
      $lastRuntimeId = $id
      $ct  = $el.Current.ControlType.ProgrammaticName
      $nm  = $el.Current.Name
      $ht  = $el.GetCurrentPropertyValue([System.Windows.Automation.AutomationElement]::HelpTextProperty)
      $leg = $null
      try {
        $legacy = $el.GetCurrentPattern([System.Windows.Automation.LegacyIAccessiblePatternIdentifiers]::Pattern)
        if ($legacy) { $leg = $legacy.Current.Value }
      } catch {}

      Write-Host "Type=$ct`nName=$nm`nHelpText=$ht`nLegacyValue=$leg`n----"
    }
  }
  Start-Sleep -Milliseconds 200
}

実行例

ボタンにカーソルを合わせると:

Type=ControlType.Button
Name=OK
HelpText=

LegacyValue=

ブラウザのリンクにカーソルを合わせると:

場合によっては Name にリンクテキストが入り、LegacyValue や HelpText にURLが入ることもあります。

ただし、Chromium系ブラウザ(Edge, Chromeなど)はセキュリティの関係で href を直接取れないことが多いです。


注意点

取得できる情報はアプリによって異なる

IEや古いアプリではURLなどが取れる場合があります。

Edge/Chrome/FirefoxはURLを返さないことが多いです。

補助的な用途に向く

「テキストラベルやボタンのキャプションを取得する」には有効です。

「ブラウザのリンク先URLを正確に取る」には別の方法(DevTools Protocolなど)が必要です。


まとめ

UI Automationを利用すると、マウスオーバー中の要素情報をPowerShellで簡単に取れる。

テキストやボタン情報の収集に便利。

ただし、モダンブラウザのリンクURL取得には向かないので、確実にURLが必要ならブラウザのデバッグAPIを検討しましょう。

スポンサーリンク

-IT関連
-,