---
title: "UIAutomationとは｜Windows UI自動化の仕組みとC#・Python・VBA実装【2026年版】"
url: "https://www.issoh.co.jp/tech/details/3395/"
published: 2024-08-26
updated: 2026-10-14
categories: ["自動化"]
publisher: "株式会社一創"
---

# UIAutomationとは｜Windows UI自動化の仕組みとC\#・Python・VBA実装【2026年版】

UIAutomation（Microsoft UI Automation、略してUIA）は、Windowsに標準搭載されたアクセシビリティAPIです。スクリーンリーダーが画面を読み上げるための仕組みですが、同じAPIをテスト自動化や業務システムの操作自動化に転用できます。ボタンやテキストボックスを**UI要素そのもの**として取得するので、パターンで操作する限り、座標をクリックする画像認識型のマクロと違ってウィンドウ位置がずれても壊れません。この記事では、UIAの構造を押さえたうえで、C#・Python・VBA・PowerShellの実装、Invoke以外のコントロールパターン、WinAppDriverの後継の現状、要素が取得できないときの原因までを扱います。ライブラリの版は2026年10月14日にNuGet・PyPI・GitHubで確認した値です。

## まとめ

- UIAは**プロバイダーAPI（アプリ側が情報を公開する）とクライアントAPI（自動化する側が読み取り・操作する）**の二層構造。自動化スクリプトを書く立場ならクライアントAPIだけ理解すればよい。
- 操作対象の指定は**AutomationIdを最優先**にする。Name（表示文字列）に依存すると、表示言語の違いや文言変更でスクリプトが壊れる。
- 要素の調査は後継の**Accessibility Insights for Windows**で行う。Windows SDK同梱の`Inspect.exe`はMicrosoft自身がレガシツールと位置づけている。
- 言語別の入り口は、C#＝**FlaUI.UIA3 5.0.0**、Python＝**uiautomation 2.0.29**、VBA＝参照設定の**UIAutomationClient**（`CreateObject`では呼べない）、PowerShell＝追加インストールなし。
- ボタンを押すなら**`Invoke()`（パターン呼び出し）を使い、`Click()`は最後の手段**にする。FlaUIもPythonのuiautomationも、`Click()`は実際にマウスカーソルを動かしてクリックする実装になっている。
- WinAppDriverは安定版v1.2.1（2020年11月）が最後。Appiumの`appium-windows-driver`も非推奨になり、公式の後継は**Appium WinCore Driver**。新規にWinAppDriverを土台にする理由はない。

## UIAutomationの正体：Windows標準のアクセシビリティAPI

UIAはWindows Vistaで導入され、それ以前のMicrosoft Active Accessibility（MSAA）を置き換える位置づけで設計されました。[Microsoft Learnの「UI オートメーションの概要」](https://learn.microsoft.com/ja-jp/dotnet/framework/ui-automation/ui-automation-overview)は、WPFボタンの`Content`、Win32ボタンの`Caption`、HTML画像の`ALT`がいずれもUIAの単一プロパティ`Name`にマップされると説明しています。UIフレームワークの違いをUIAコアが吸収するため、**WPF・WinForms・Win32・ストアアプリを同じコードで扱える**のがUIAの価値です。

### 4つの構成要素とAPIの二層構造

Microsoftのドキュメントは、UIAを次の4コンポーネントに分けています。

| コンポーネント       | 実体                                               | 担当                  |
| ------------- | ------------------------------------------------ | ------------------- |
| プロバイダーAPI     | UIAutomationProvider.dll / UIAutomationTypes.dll | アプリ側がUI情報を公開する      |
| クライアントAPI     | UIAutomationClient.dll / UIAutomationTypes.dll   | 自動化する側が要素を取得・操作する   |
| UIAコア         | UiAutomationCore.dll                             | プロバイダーとクライアントの通信を仲介 |
| クライアント側プロバイダー | UIAutomationClientsideProviders.dll              | レガシコントロールをUIA対応に見せる |

自動化スクリプトを書くだけなら、必要なのはクライアントAPIだけです。プロバイダーAPIは自作のカスタムコントロールを支援技術やテストツールから見えるようにしたい開発者が実装する側で、ここを混同すると`System.Windows.Automation.Provider`の解説を延々と読むことになります。

### マネージドAPIとCOM APIの型名の対応

UIAのクライアントAPIには、.NETのマネージドAPI（`System.Windows.Automation`）と、COMのAPI（`UIAutomationCore.dll`）の2系統があります。マネージドAPIのドキュメントは冒頭で「UI オートメーションの最新情報については Windows Automation API を参照」と案内しており、最新情報の参照先はCOM側です。FlaUIの`UIA3`、Pythonのuiautomation、VBAはいずれもCOM APIを呼んでいます。検索で出てくる型名は、次のように対応します。

| 役割        | マネージドAPI（C#）                  | COM API（C++・VBA・Python）       |
| --------- | ----------------------------- | ----------------------------- |
| 入口のオブジェクト | AutomationElement.RootElement | CUIAutomation → IUIAutomation |
| UI要素      | AutomationElement             | IUIAutomationElement          |
| 検索条件      | PropertyCondition             | IUIAutomationCondition        |
| ボタンを押す    | InvokePattern                 | IUIAutomationInvokePattern    |
| 参照するもの    | UIAutomationClient.dll（アセンブリ） | UIAutomationClient（タイプライブラリ）  |

`UIAutomationCore.dll`はWindowsの`System32`に最初から入っているOSの部品です。[IUIAutomationのリファレンス](https://learn.microsoft.com/en-us/windows/win32/api/uiautomationclient/nn-uiautomationclient-iuiautomation)も、クライアントは`CoCreateInstance`で`CUIAutomation`オブジェクトを作り`IUIAutomation`を取得する、という手順を示しています。PythonのuiautomationもソースコードでCLSID `{ff48dba4-60ef-4201-aa87-54103eef594e}`（CUIAutomation）を指定して同じオブジェクトを作っています。

### 要素ツリーの3つのビューとコントロールパターン

UIAはデスクトップをルートとする木構造としてUIを公開します。この木には3つのビューがあります。

- **Rawビュー**：すべての要素。レイアウト用のパネルまで含むため深く、探索が遅くなる。
- **Controlビュー**：ユーザーが操作・認識できるコントロールのみ。通常の自動化はここを使う。
- **Contentビュー**：情報として意味のある要素のみ。スクリーンリーダー向け。

各要素は`Name`や`AutomationId`といったプロパティに加えて、**コントロールパターン**を公開します。パターンは「その要素で何ができるか」を表す振る舞いの単位です。公式ドキュメントが明記しているとおり、**コントロール種別とパターンは一対一ではありません**。コンボボックスは展開・折りたたみの`ExpandCollapsePattern`と選択の`SelectionPattern`を同時に持ちます。「押せない」「値が入らない」とつまずく原因の多くは、その要素がサポートしていないパターンを呼んでいることです。

## 操作対象の特定：InspectとAccessibility Insights

コードを書く前に、対象アプリの要素がどんな`AutomationId`・`Name`・`ControlType`を持ち、どのパターンをサポートするかを調べます。

- **Accessibility Insights for Windows**：Microsoftが公開している調査ツール。要素にホバーするだけでUIAのプロパティ・パターン・イベントを確認できる。2026年10月時点の最新の正式版は[v1.1.2924.01](https://github.com/microsoft/accessibility-insights-windows/releases)（2025年1月のリリース）。
- **Inspect.exe**：Windows SDKに同梱され、単体では配布されない。SDKのインストール先の`\bin\<version>\<platform>`にある。[Microsoft Learnのページ](https://learn.microsoft.com/en-us/windows/win32/winauto/inspect-objects)は冒頭で「Inspect is a legacy tool. We recommend Accessibility Insights instead.」と明記している。
- **FlaUInspect**：FlaUIの開発元が出している調査ツール。UIA2とUIA3を切り替えて表示でき、FlaUIで書くなら見え方が一致する。最新は[v3.1.0（2026年8月）](https://github.com/FlaUI/FlaUInspect/releases)。

見るべきは`AutomationId`です。Windowsの電卓であれば「7」ボタンは`num7Button`、「＝」は`equalButton`という固定のIDを持っています。**Nameで探すコードは、表示言語が日本語か英語かだけで動かなくなります**（電卓のウィンドウ名は日本語環境で「電卓」、英語環境で「Calculator」）。[Microsoftのテスト自動化向けガイド](https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-usefortesting)も、Nameはローカライズされうるうえ兄弟要素の間で一意でもないとして、テストではAutomationIdかRuntimeIdを使うよう求めています。AutomationIdも探索範囲によっては重複しうるので、まずウィンドウを掴み、その配下で探します。AutomationIdが振られていない要素に限り、ControlType＋Nameの組み合わせや、親要素からの相対位置で妥協します。

## 言語別の実装：C#・Python・VBA・PowerShell

以下はいずれも電卓を操作する最小の実装です。手順はどの言語でも同じで、**ルート（デスクトップ）→ウィンドウ→目的の要素と条件で絞り込み、パターンを取得して呼ぶ**という流れになります。前提は、日本語表示のWindowsで電卓を標準モードで1つだけ開いていることです（Pythonの例は起動も行います。C#・VBA・PowerShellの例は電卓が起動済みでないと`null`や`Nothing`に対する操作で失敗します）。

### C#：System.Windows.AutomationとFlaUI

.NET 8でマネージドAPIを使う場合、UIAのアセンブリはWPFのプロファイルに属しているため、プロジェクトファイルで`UseWPF`を有効にします（Microsoft.WindowsDesktop.App.Ref 8.0.32の`FrameworkList.xml`で、`UIAutomationClient`が`Profile="WPF"`に分類されていることを確認）。

```
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>
```

```
using System.Windows.Automation;

var window = AutomationElement.RootElement.FindFirst(
    TreeScope.Children,
    new PropertyCondition(AutomationElement.NameProperty, "電卓"));

var seven = window.FindFirst(
    TreeScope.Descendants,
    new PropertyCondition(AutomationElement.AutomationIdProperty, "num7Button"));

var invoke = (InvokePattern)seven.GetCurrentPattern(InvokePattern.Pattern);
invoke.Invoke();
```

`FindFirst`は要素が現れるまで再試行しないため、ウィンドウの表示が遅いと`null`を返して次の行で落ちます。実務では[FlaUI.UIA3](https://www.nuget.org/packages/FlaUI.UIA3)（最新5.0.0、2025年2月25日公開、MITライセンス、対象は.NET Framework 4.8・net6.0-windows・net8.0-windows）を使うと、要素検索とパターン呼び出しが1行にまとまり、出現待ちも`Retry.WhileNull`で書けます。上のプロジェクトにパッケージを追加します。

```
dotnet add package FlaUI.UIA3 --version 5.0.0
```

```
using System;
using FlaUI.Core.AutomationElements;
using FlaUI.Core.Tools;
using FlaUI.UIA3;

using var automation = new UIA3Automation();
var desktop = automation.GetDesktop();

var window = Retry.WhileNull(
        () => desktop.FindFirstChild(cf => cf.ByName("電卓")),
        timeout: TimeSpan.FromSeconds(10),
        throwOnTimeout: true)
    .Result!
    .AsWindow();

window.FindFirstDescendant(cf => cf.ByAutomationId("num7Button"))
      .AsButton()
      .Invoke();
```

ここで`Application.Launch("calc.exe")`から`GetMainWindow(automation)`を呼ぶ書き方をすると、電卓では要素が取れません。現在の電卓はストアアプリで、`calc.exe`は本体を起こして自分は終了するランチャーにすぎず、Launchが返すプロセスにウィンドウが存在しないためです。**起動プロセスと自動化対象プロセスが一致しないアプリでは、デスクトップから名前で引く**（上のコードの形）か、FlaUIの`Application.LaunchStoreApp`にアプリのAppUserModelIdを渡して起動します。

### Python：pip install uiautomation

Pythonでは[uiautomation](https://pypi.org/project/uiautomation/)パッケージ（最新2.0.29、2025年8月5日公開、Apache-2.0、PyPIの対応表記はPython 3.4〜3.12）が定番です。内部はcomtypes経由でUIAのCOM APIを呼んでいます。

```
pip install uiautomation
```

```
import subprocess
import uiautomation as auto

subprocess.Popen('calc.exe')
auto.SetGlobalSearchTimeout(5)

calc = auto.WindowControl(searchDepth=1, RegexName='電卓|Calculator')
for aid in ('num7Button', 'plusButton', 'num3Button', 'equalButton'):
    calc.ButtonControl(AutomationId=aid).GetInvokePattern().Invoke()

print(calc.TextControl(AutomationId='CalculatorResults').Name)
```

`SetGlobalSearchTimeout`は要素が現れるまで再検索する上限秒数で、既定は10秒です。最終行の`CalculatorResults`が返す`Name`は数値だけでなく「表示は 10」（英語環境では「Display is 10」）という読み上げ用の文字列なので、値として使うならパースが要ります。要素ツリーは`auto.EnumAndLogControl`でダンプでき、Inspectを開かずに構造を把握できます。なお、`pip install uiautomation`で入るのはyinkaisheng氏が保守するサードパーティ製ラッパーで、Microsoftの製品ではありません。

### VBA：UIAutomationClientの参照設定と事前バインディング

ExcelなどのVBAからもUIAは使えます。最もつまずきやすいのは、**`CreateObject("UIAutomationClient")`が動かない**ことです。UIAのクライアントはProgIDを持つ通常のCOMオブジェクトとして登録されていないためです。VBEの［ツール］→［参照設定］で**UIAutomationClient**にチェックを入れて事前バインディングにします（実体は`C:\Windows\System32\UIAutomationCore.dll`のタイプライブラリ）。`IUIAutomation`はIDispatchではなくIUnknownから派生したインターフェイスなので、`Object`型の変数に入れてメソッドを呼ぶ遅延バインディングは成り立ちません。`CUIAutomation`・`IUIAutomationElement`といった型付きの変数で書くのが前提です。

```
Sub ClickSeven()
    Dim uia As New CUIAutomation
    Dim root As IUIAutomationElement
    Dim cond As IUIAutomationCondition
    Dim win As IUIAutomationElement
    Dim btn As IUIAutomationElement
    Dim inv As IUIAutomationInvokePattern

    Set root = uia.GetRootElement()
    Set cond = uia.CreatePropertyCondition(UIA_NamePropertyId, "電卓")
    Set win = root.FindFirst(TreeScope_Children, cond)

    Set cond = uia.CreatePropertyCondition(UIA_AutomationIdPropertyId, "num7Button")
    Set btn = win.FindFirst(TreeScope_Descendants, cond)

    Set inv = btn.GetCurrentPattern(UIA_InvokePatternId)
    inv.Invoke
End Sub
```

Excelの操作をVBAで、他アプリの画面操作をUIAで、という組み合わせはレガシー業務システムのデータ転記でよく採られます。Web版OfficeのOffice Scriptsには外部アプリを操作する機能がないため、移行を考えているなら[Office ScriptsとVBAの違い](/tech/details/11630/)で境界を確認してください。

### PowerShell：Add-Typeによるアセンブリ読み込み

手元で挙動を確認するだけなら、PowerShellが最短です。.NETのアセンブリをロードするだけで動きます。Windows PowerShell 5.1に加え、Windows版のPowerShell 7系も配布物に`UIAutomationClient.dll`と`UIAutomationTypes.dll`を同梱しています（7.6.7のwin-x64 zipで確認）。

```
Add-Type -AssemblyName UIAutomationClient, UIAutomationTypes

$root = [Windows.Automation.AutomationElement]::RootElement
$cond = New-Object Windows.Automation.PropertyCondition(
    [Windows.Automation.AutomationElement]::NameProperty, "電卓")
$win  = $root.FindFirst("Children", $cond)

$cond = New-Object Windows.Automation.PropertyCondition(
    [Windows.Automation.AutomationElement]::AutomationIdProperty, "num7Button")
$btn = $win.FindFirst("Descendants", $cond)
$btn.GetCurrentPattern([Windows.Automation.InvokePattern]::Pattern).Invoke()
```

## Invoke以外のコントロールパターン：チェック・入力・選択・展開

ボタン以外の要素は、それぞれ別のパターンで操作します。よく使う5つを、マネージドAPI・FlaUI 5.0.0・Python uiautomation 2.0.29の呼び方で並べます（FlaUIとuiautomationはソースで該当メソッドの存在を確認）。

| パターン                  | 主な対象        | マネージドAPI          | FlaUI                           | Python                                |
| --------------------- | ----------- | ----------------- | ------------------------------- | ------------------------------------- |
| TogglePattern         | チェックボックス    | `Toggle()`        | `AsCheckBox().IsChecked = true` | `GetTogglePattern().Toggle()`         |
| ValuePattern          | テキストボックス    | `SetValue("abc")` | `AsTextBox().Text = "abc"`      | `GetValuePattern().SetValue("abc")`   |
| SelectionItemPattern  | リスト項目・タブ    | `Select()`        | `AsListBoxItem().Select()`      | `GetSelectionItemPattern().Select()`  |
| ExpandCollapsePattern | コンボボックス・ツリー | `Expand()`        | `AsComboBox().Expand()`         | `GetExpandCollapsePattern().Expand()` |
| WindowPattern         | ウィンドウ       | `Close()`         | `AsWindow().Close()`            | `GetWindowPattern().Close()`          |

FlaUIの便利メソッドは、パターンが無いときに別の手段へ自動で切り替えるものがあります。たとえば`TextBox.Text`への代入は、ValuePatternがあればそれで値を入れ、無ければWin32メッセージ、それも失敗したらキーボード入力（`Enter`）に落ちます。パスワード欄の`Text`を読むと例外になる点も実装どおりです。どの手段で入ったかがコードから見えないので、入力イベントを拾う画面で挙動が変わったら、パターンを直接呼ぶ書き方（`element.Patterns.Value.Pattern.SetValue(...)`）に戻して切り分けます。

### Invoke()とClick()の違い：パターン呼び出しとマウス入力

名前が似ていますが、`Invoke()`と`Click()`は別物です。FlaUI 5.0.0の`AutomationElement.Click()`は`GetClickablePoint()`で座標を求めてマウスカーソルをそこへ移し、左クリックを送ります。Pythonのuiautomation 2.0.29の`Control.Click()`も、要素の`BoundingRectangle`の中央へカーソルを動かしてクリックする実装で、矩形の幅か高さが0のときは「Can not move cursor」とログを出すだけで例外を投げずに戻ります。

つまり`Click()`は、画面がロックされている、ウィンドウが他のウィンドウの下にある、リモートデスクトップを最小化している、といった状況で失敗するか、別の場所を押します。**夜間バッチやCIで回すなら、ボタンは`Invoke()`で押す**のが原則です。ただし`Invoke()`で避けられるのはマウス入力に伴う失敗だけで、対象アプリがユーザーのログオン中のデスクトップで動いていることは前提として残ります。サービスとして起動したプロセスからは、ユーザーのデスクトップ上のウィンドウに届きません。`Click()`を使うのは、InvokePatternを公開していない独自描画のボタンなど、パターンで操作できない要素に限ります。

## UIAを選ぶべき場面と、選ぶべきでない場面

UIAは万能ではありません。次の切り分けを最初に決めておくと、作ってから作り直す事故を防げます。

| 対象                        | 適した手段                   | UIAの位置づけ         |
| ------------------------- | ----------------------- | ---------------- |
| WPF / WinForms / Win32アプリ | UIA（FlaUI・uiautomation） | 本命               |
| ブラウザ上のWebアプリ              | Playwright・Selenium     | 使わない             |
| 複数システムをまたぐ業務フロー           | RPA（OpenRPA・UiPath等）    | RPAの内部で使われることがある |
| UIを持たない処理                 | API・CLI・DB直結            | 使わない             |

**新規に組むなら、Webアプリの操作にUIAは選びません**。ChromiumベースのブラウザはDOMの要素をUIAツリーにも公開するため一見操作できますが、UIAにはネットワークやJavaScript実行の完了を待つ仕組みも、フレームを切り替える手段も、DOMセレクタもありません。[Playwright](/tech/details/3167/)のようなブラウザ専用ツールに安定性で勝てません。

### RPA・画像認識ツールとの違い

RPAツールは製品ごとに画面の掴み方が違います。[OpenRPA](/tech/details/9050/)のWindows操作はUIAベースで要素を掴みますが、[TagUI](/tech/details/9041/)はSikuliXによる画像認識とOCRでデスクトップを操作します。Pythonの[PyAutoGUI](/tech/details/3600/)も画面の画像と座標で動く方式です。**画像認識型は解像度・テーマ・フォントの変化で壊れます**。国産RPAで画像認識に頼ったシナリオが保守で破綻する例は[WinActorが使えないと言われる理由](/tech/details/16785/)で整理しています。

検索結果で並ぶUiPathの[UI Automation アクティビティ パッケージ](https://docs.uipath.com/ja/activities/other/latest/ui-automation/about-the-ui-automation-activities-pack)は、UiPath Studioで画面操作を組むための同社製アクティビティ群の名前で、この記事のWindows APIとは別の製品の部品です。複数アプリを横断する定型業務をノーコードで組み、保守も含めて回したいなら、自前でUIAを書くよりRPA製品のほうが手数は少なく済みます。UiPathでの構築を検討しているなら、[UiPath導入支援サービス](https://www.issoh.co.jp/service/rpa/uipath/)で要件整理から相談できます。UIAを直接書く価値があるのは、RPAツールでは掴めない独自コントロールがある、CIに組み込むテストコードとしてバージョン管理したい、といったツールの抽象化が邪魔になる領域です。

### WinAppDriverの現状と後継のAppiumドライバー

Appium経由でWindowsアプリをE2Eテストする定番として紹介されてきたWinAppDriverは、[GitHubのリリース一覧](https://github.com/microsoft/WinAppDriver/releases)で見ると最後の安定版がv1.2.1（2020年11月5日）、最後のプレリリースがv1.3のRC1にあたるv1.2.99（2021年7月1日）で、以降は出ていません。

Appium側では、[appium-windows-driver](https://github.com/appium/appium-windows-driver)のREADMEが「This driver is deprecated and is not compatible with Appium 4 and later」と明記し、WinAppDriverサーバーが旧来のJSONWPプロトコルしか話せないことを理由に挙げて、公式の後継として[Appium WinCore Driver](https://github.com/appium/appium-wincore-driver)を案内しています。WinCore DriverはWinAppDriverを経由せずUIAを直接使う実装で、2026年10月7日に3.1.2が出ており、Appium 4向けのベータ版もリリース済みです。Appiumのドライバー一覧では、コミュニティ製のNovaWindows Driver（最新1.4.5）もWindowsドライバーの置き換え先として推奨されています。

結論として、**これから新規に組むならWinAppDriverを土台に選ぶ理由はありません**。Appiumで他のモバイルテストと揃えたいならWinCore Driver、C#単体で完結させるならFlaUI、Pythonならuiautomationかpywinauto（最新0.6.9、`backend="uia"`指定でUIAを使う）へ寄せます。Appium 3への移行の全体像は[Appium Desktopの終了とAppium 3時代のInspector移行](/tech/details/10729/)を参照してください。

## UIA操作が失敗・遅延するときの4つの原因

### FindFirstがnullを返す原因：待機・探索スコープ・ツリー非公開

まず待機を疑います。起動直後やダイアログ表示直後は要素がまだツリーにいないので、FlaUIなら`Retry.WhileNull`、Pythonなら`SetGlobalSearchTimeout`か`Exists(秒数)`で待ってから探します。次に、探索スコープが`TreeScope.Children`のままで、実際は孫以下にあるケースです。それでも見つからなければAccessibility Insightsで**その要素がUIAツリーに存在するか**を確認します。DirectXやOpenGLで画面を自前描画するアプリはプロバイダーを実装しておらず、ウィンドウ1個としてしか見えないことがあります。この場合はUIAでは手が出ないので、まずアプリ側にAPIやCLI、テスト用のインターフェイスがないかを確認し、無ければ画像認識やキーボード操作の送出に切り替えます。

### UIPIによる制限：操作元と対象の権限差

WindowsのUIPI（ユーザーインターフェイス特権の分離）により、**権限の低いプロセスから管理者として昇格したプロセスのUIへは操作を送れません**。対象アプリを管理者として実行しているなら、自動化スクリプト側も管理者として実行します。[UIAのセキュリティ概要](https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-securityoverview)によれば、例外はマニフェストにUIAccessフラグを持ち、Authenticodeで署名され、Program Filesのような保護された場所に置かれた支援技術アプリです。同じページは支援技術でないアプリにUIAccessを使うべきではないと明記しているので、自動化スクリプトの回避策にはなりません。また、マネージドAPIのドキュメントは、［実行］コマンドで別ユーザーとして起動したプロセスとの間ではUIAの通信が有効にならないと注記しています。

### 探索速度の劣化：プロセス境界をまたぐコスト

UIAの要素アクセスはプロセス境界をまたぐため、プロパティを1つ読むたびに通信が発生します。`TreeScope.Descendants`でデスクトップから全走査すると、開いているウィンドウと要素の数に比例して通信回数が増えます。対策は、**ウィンドウを掴んでからその配下だけを探索する**ことと、複数プロパティをまとめて取得する`CacheRequest`（COM APIでは`IUIAutomationCacheRequest`）を使うことです。ループの中で毎回ルートから引き直しているコードは、たいていここが原因で遅くなっています。

### Name依存による破損：AutomationId付与という根本対策

Nameやツリーの相対位置に依存した検索は、アプリの更新で簡単に壊れます。**自社開発アプリならAutomationIdを開発側に振ってもらう**のが根本対策です。WPFなら`AutomationProperties.AutomationId`をXAMLに書くだけで、テストコード側の要素特定は安定します。AutomationIdはテスト用の識別子で、スクリーンリーダーが読み上げるのは`AutomationProperties.Name`のほうです。読み上げ対応も兼ねたいなら、Nameも併せて設定します。他社製アプリでこれができない場合は、UIの更新でテストが落ちる前提で保守工数を見込みます。

## よくある質問

### UI Automation（UIA）とは何ですか？

Windowsに標準搭載されたアクセシビリティAPIで、デスクトップ上のUI要素をプログラムから取得・操作できます。Windows Vistaで導入され、MSAA（Microsoft Active Accessibility）を置き換える設計です。スクリーンリーダーなどの支援技術のための仕組みですが、同じクライアントAPIをテスト自動化や業務の操作自動化に使えます。

### UI AutomationはVBAから使えますか？

使えます。VBEの［ツール］→［参照設定］でUIAutomationClientを追加し、`CUIAutomation`を`New`で作る事前バインディングにします。`CreateObject`はUIAがProgIDを持たないため使えず、`IUIAutomation`がIDispatchを実装しないため`Object`型での遅延バインディングも使えません。

### UIAutomationCore.dllが見つからないときはダウンロードすべきですか？

DLL配布サイトから入手してはいけません。`UIAutomationCore.dll`はWindowsの`System32`に含まれるOSの部品で、IUIAutomationのリファレンスも必要なDLLとしてこれを挙げています。見つからないというエラーが出るなら、Windows Updateの適用やシステムファイルの修復で直すのが筋です。

### pip install uiautomationで入るのはMicrosoftの製品ですか？

いいえ。PyPIの`uiautomation`はyinkaisheng氏が保守するサードパーティ製ラッパー（Apache-2.0、最新2.0.29）で、UIAのCOM APIをPythonから呼ぶためのものです。名前が同じため混同されますが、API本体はWindows側にあります。

### UI AutomationでWebページは操作できますか？

要素自体はUIAツリーに現れますが、実用には向きません。通信やJavaScript実行の完了を待つ機構、iframeを切り替える手段、DOMセレクタがないためです。Web操作はPlaywrightやSeleniumを使います。

## 関連記事

- [Playwrightとは｜仕組み・できること・Seleniumとの違いを解説](/tech/details/3167/)
- [OpenRPAとは？無料オープンソースRPAの使い方・インストール・対応OS](/tech/details/9050/)
- [PyAutoGUIとは？インストールと使い方｜マウス・キーボード操作と0.9.54の落とし穴](/tech/details/3600/)
- [Appium Desktopは終了｜Appium 3時代のInspector移行とモバイルテスト自動化](/tech/details/10729/)
- [Office Scriptsとは？VBAとの違い・できること/できないことを公式仕様で整理](/tech/details/11630/)

---

出典: [UIAutomationとは｜Windows UI自動化の仕組みとC\#・Python・VBA実装【2026年版】](<https://www.issoh.co.jp/tech/details/3395/>)（株式会社一創）
