递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 81|回复: 6
打印 上一主题 下一主题

[AI开发] 火山视窗的 Windows UI Automation(UIA)客户端封装

[复制链接]

13

主题

68

帖子

536

积分

金牌会员

Rank: 9Rank: 9Rank: 9

积分
536
跳转到指定楼层
楼主
发表于 10 小时前 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
它用于读取和操作其他 Windows 程序向无障碍系统公开的窗口、控件和文本信息。即使目标程序没有提供普通窗口句柄,也可以通过 UIA 元素树读取控件名称、类型、状态和层级,并尝试执行选择、调用、聚焦和文本读取等操作。

典型用途包括:

- 为盲人和辅助技术软件读取应用界面。
- 枚举桌面窗口及其子控件。
- 读取按钮、列表项、文本、编辑框和文档内容。
- 根据控件名称、类型或层级定位目标元素。
- 选择列表项、调用按钮、设置键盘焦点。
- 自动化操作 QQ、微信、浏览器和常规桌面软件。
- 开发 UIA 检查器、自动化测试工具和无障碍辅助程序。
当前火山封装公开以下类:

| 类 | 作用 |
| --- | --- |
| `树范围` | 指定从元素自身、直接子级、全部后代、父级、祖先或整个子树中查找 |
| `属性ID` | 常用 UIA 属性标识,用于属性条件和缓存读取 |
| `控件类型` | 常用 UIA 控件类型常量 |
| `模式ID` | 调用、选择、值、切换、展开折叠、滚动项和文本模式标识 |
| `缓存元素模式` | 指定缓存元素为仅缓存或完整元素 |
| `UIA事件种类` | 区分焦点、结构、属性和文本等事件记录 |
| `UIARuntime` | 初始化 UIA/COM、取得根元素、创建条件/缓存以及管理事件订阅 |
| `UIAElement` | 表示一个窗口或控件,读取属性并执行查找和操作 |
| `UIAElementArray` | 保存查找返回的元素集合 |
| `UIACondition` | 表示 UIA 查找条件 |
| `UIAPattern` | 表示控件支持的具体操作模式 |
| `UIATextRange` | 搜索、读取、选择和滚动文本范围 |
| `UIACacheRequest` | 配置批量读取的属性、模式和树范围 |
| `UIA事件` | 保存从事件队列取出的变化记录和源元素 |


树范围`用于指定 `UIAElement.查找全部` 的搜索范围:

| 常量 | 说明 |
| --- | --- |
| `元素自身` | 仅当前元素 |
| `直接子级` | 当前元素的下一层子元素 |
| `全部后代` | 当前元素下面的全部后代元素 |
| `父级` | 当前元素的直接父元素 |
| `全部祖先` | 当前元素向上的全部祖先 |
| `子树` | 当前元素和它的全部后代 |

递归解析界面时建议使用 `直接子级`,这样可以保留真实层级关系。只需要一次取得扁平结果时可以使用 `全部后代`。

## 4. 控件类型

`控件类型`提供常见 UIA ControlType 常量,包括:

- 按钮、日历、复选框、组合框和编辑框。
- 超链接、图像、文本和工具栏。
- 列表、列表项、菜单和菜单项。
- 进度条、单选框、滚动条和滑块。
- 树、树项和窗口。

控件类型用于判断元素语义,不应把它当成可点击性的唯一依据。QQ 等自绘程序可能把顶层窗口或会话容器公开为 `Pane`、`Custom` 或其他类型。
创建`的公寓模型参数:

| 值 | 说明 |
| --- | --- |
| `0` | 自动模式,推荐火山窗口线程使用 |
| `1` | STA |
| `2` | MTA,通常用于后台工作线程 |

自动模式会兼容线程已经初始化 COM 的情况,避免重复修改线程模式导致“无法在设置线程模式后对其加以更改”。

- `取根元素()`:取得桌面 UIA 根元素。
- `取指定窗口元素(HWND)`:根据窗口句柄取得 UIA 元素。
- `创建真条件()`:创建匹配所有元素的条件。
- `创建假条件()`:创建不匹配任何元素的条件。
- `创建文本属性条件()`、`创建整数属性条件()`、`创建逻辑属性条件()`:按属性精确定位。
- `创建与条件()`、`创建或条件()`、`创建非条件()`:组合查询条件。
- `创建缓存请求()`:创建批量属性和模式缓存。
- `订阅焦点变化()`、`订阅结构变化()`、`订阅文本变化()`:返回事件订阅令牌。
- `取出事件()`、`等待事件()`:读取事件队列。
- `取错误码()`:取得当前线程最后错误码。
- `取错误信息()`:取得当前线程最后错误说明。
- `销毁()`:释放运行环境,可重复调用。
当前公开的属性读取能力:

| 方法 | 返回内容 |
| --- | --- |
| `取名称()` | 无障碍名称,聊天文字、按钮标题和联系人名称通常从这里读取 |
| `取自动化标识()` | AutomationId |
| `取本地化控件类型()` | 本地化后的控件类型名称 |
| `取类名()` | 控件类名 |
| `取控件类型()` | UIA ControlType 数值 |
| `取进程标识()` | 所属进程 ID |
| `取窗口句柄()` | 原生 HWND;普通子元素返回 0 属于正常情况 |
| `是否启用()` | 控件当前是否启用 |
| `是否离屏()` | 控件当前是否位于可见区域之外 |
| `是否可键盘聚焦()` | 是否允许键盘焦点 |
| `是否拥有键盘焦点()` | 当前是否具有键盘焦点 |
| `取左边()`、`取顶边()` | 元素屏幕坐标 |
| `取宽度()`、`取高度()` | 元素包围矩形尺寸 |

- `取父元素()`:取得原始 UIA 树中的父元素。
- `查找首个(范围, 条件)`:返回第一个匹配元素。
- `查找全部(范围, 条件)`:在指定范围内查找全部匹配元素。
- `带缓存查找首个()`、`带缓存查找全部()`:查找元素并批量构建缓存。
- `取缓存名称()`、`取缓存属性值()`、`取缓存模式()`:读取预先缓存的数据。
- `是否为空()`:判断元素句柄是否有效。
- `释放()`:释放元素句柄。


- `设置焦点()`:尝试让元素获得键盘焦点。
- `取模式(模式ID)`:取得元素支持的操作模式。
- `单击中心()`:通过鼠标单击元素包围矩形中心;只建议作为模式操作失败后的兜底方案。

UIA 模式表示元素支持的语义操作。

当前公开的模式:

| 模式 | 火山调用 | 用途 |
| --- | --- | --- |
| Invoke | `模式ID.调用` / `UIAPattern.调用()` | 调用按钮或命令 |
| SelectionItem | `模式ID.选择项` / `UIAPattern.选择()` | 选择列表项、树项或会话项 |
| Text | `模式ID.文本` / `取文档文本()`、`取文档文本范围()` | 读取完整文本或取得可搜索文本范围 |
| Value | `模式ID.值` / `取值()`、`置值()` | 读取或修改编辑框等值控件 |
| Toggle | `模式ID.切换` / `切换()`、`取切换状态()` | 操作复选框或开关 |
| ExpandCollapse | `模式ID.展开折叠` / `展开()`、`折叠()` | 操作组合框、树项和折叠面板 |
| ScrollItem | `模式ID.滚动项` / `滚动到视图()` | 将虚拟列表项目滚动到可见区域 |

推荐的激活顺序:

1. 在目标元素上尝试 `SelectionItem`。
2. 再尝试 `Invoke`。
3. 如果名称节点本身不支持模式,向上查找父元素。
4. 所有语义模式都不可用时,最后使用 `单击中心()`。

物理单击会移动鼠标,并且依赖元素坐标、窗口位置和 DPI 状态,不如 UIA 模式稳定。

建议按以下顺序使用:

1. 创建 `UIARuntime`。
2. 创建查询条件。
3. 取得桌面根元素或指定 HWND 元素。
4. 查找或递归遍历目标元素。
5. 读取属性或取得模式执行操作。
6. 释放模式、子元素、数组和条件。
7. 最后销毁运行时。

完整资源释放顺序示例:
游客,如果您要查看本帖隐藏内容请回复









火山视窗火山PC软件开发平台交流群
QQ群:95838248
回复

使用道具 举报

18

主题

168

帖子

1896

积分

金牌会员

Rank: 9Rank: 9Rank: 9

积分
1896
QQ
7#
发表于 5 分钟前 | 只看该作者

强的批爆
交流群95838248
回复

使用道具 举报

11

主题

172

帖子

1871

积分

银牌会员

Rank: 6Rank: 6

积分
1871
6#
发表于 17 分钟前 | 只看该作者
强的批爆
回复

使用道具 举报

5

主题

171

帖子

3215

积分

金牌会员

Rank: 9Rank: 9Rank: 9

积分
3215
5#
发表于 29 分钟前 | 只看该作者
666666666
回复

使用道具 举报

15

主题

92

帖子

352

积分

中级会员

Rank: 3Rank: 3

积分
352
地板
发表于 半小时前 | 只看该作者
66666666666666666666666
回复

使用道具 举报

1

主题

48

帖子

2316

积分

金牌会员

Rank: 9Rank: 9Rank: 9

积分
2316
板凳
发表于 1 小时前 | 只看该作者
支持大佬!!
回复

使用道具 举报

2

主题

53

帖子

444

积分

金牌会员

Rank: 9Rank: 9Rank: 9

积分
444
沙发
发表于 1 小时前 | 只看该作者
支持一下!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2026-8-27 12:33 , Processed in 0.099114 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表