Windows環境で「いまマウスカーソルが乗っているUI要素の情報」を取得したいケースがあります。例えば、ブラウザ上でリンクにマウスオーバーしているときに、その要素のテキストやヒント情報を取得したい場合です。
ここでは UI Automation API をPowerShellから利用して、カーソル直下の要素を定期的に取得・表示する方法を紹介します。
手順概要
- UI Automationを使えるようにする
PresentationCore / PresentationFramework / WindowsBase / UIAutomationClient を読み込みます。
- カーソル座標を取得する
user32.dll の GetCursorPos を呼び出し、スクリーン上のカーソル位置を取得します。
- その座標からAutomationElementを取得
AutomationElement.FromPoint() を使うことで、UI Automation要素を取得できます。
- 要素の情報を表示する
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を検討しましょう。