获取并打印单个 UI 元素的特定属性
use uiautomation::UIAutomation;
use uiautomation::types::UIProperty;
use uiautomation::variants::Variant;
fn main() {
let automation = UIAutomation::new().unwrap();
let root = automation.get_root_element().unwrap();
let name: Variant = root.get_property_value(UIProperty::Name).unwrap();
println!("name = {}", name.get_string().unwrap());
let ctrl_type: Variant = root.get_property_value(UIProperty::ControlType).unwrap();
let ctrl_type_id: i32 = ctrl_type.try_into().unwrap();
println!("control type = {}", ctrl_type_id);
let enabled: Variant = root.get_property_value(UIProperty::IsEnabled).unwrap();
let enabled_str: String = enabled.try_into().unwrap();
println!("enabled = {}", enabled_str);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
输出:
name = 桌面 1
control type = 50033
enabled = True
1
2
3
2
3
这段代码同样使用了 uiautomation
库,但它的目的不是遍历整个 UI 树,而是获取并打印单个 UI 元素(在这里是桌面根元素)的特定属性。它演示了如何查询一个元素的名称(Name)、控件类型(Control Type)和是否启用(IsEnabled)这三个基本属性。
# 代码分步讲解
# main
函数:初始化并查询属性
use uiautomation::UIAutomation;
use uiautomation::types::UIProperty;
use uiautomation::variants::Variant;
fn main() {
// 1. 初始化 UIAutomation 库
let automation = UIAutomation::new().unwrap();
// 2. 获取桌面作为根 UI 元素
let root = automation.get_root_element().unwrap();
// 3. 获取并打印 "Name" 属性
let name: Variant = root.get_property_value(UIProperty::Name).unwrap();
println!("name = {}", name.get_string().unwrap());
// 4. 获取并打印 "ControlType" 属性
let ctrl_type: Variant = root.get_property_value(UIProperty::ControlType).unwrap();
let ctrl_type_id: i32 = ctrl_type.try_into().unwrap();
println!("control type = {}", ctrl_type_id);
// 5. 获取并打印 "IsEnabled" 属性
let enabled: Variant = root.get_property_value(UIProperty::IsEnabled).unwrap();
let enabled_str: String = enabled.try_into().unwrap();
println!("enabled = {}", enabled_str);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
UIAutomation::new().unwrap()
: 与前一个例子一样,这行代码创建了一个UIAutomation
客户端实例,用于后续的所有操作。automation.get_root_element().unwrap()
: 获取代表整个桌面的根 UI 元素,作为查询属性的目标。
- 获取名称(Name)属性:
root.get_property_value(UIProperty::Name).unwrap()
: 这是核心的属性查询方法。get_property_value
用于获取指定 UI 元素的某个属性值。UIProperty::Name
是一个枚举成员,它告诉函数我们想要获取的是“名称”属性。对于根元素来说,这个名称通常是 "Desktop"(桌面)。
let name: Variant = ...
: 该方法返回一个Variant
类型的值。Variant
是一个可以容纳多种不同数据类型(如字符串、整数、布尔值等)的通用容器,因为不同的 UI 属性其值的类型也不同。println!("name = {}", name.get_string().unwrap())
: 我们知道“名称”属性是一个字符串,所以使用get_string()
方法从Variant
中提取出字符串值并打印。
- 获取控件类型(Control Type)属性:
root.get_property_value(UIProperty::ControlType).unwrap()
: 这次,我们使用UIProperty::ControlType
来查询控件的类型。每个 UI 元素都有一个类型ID,用来标识它是窗口、按钮、编辑框还是其他类型的控件。let ctrl_type_id: i32 = ctrl_type.try_into().unwrap()
: 控件类型ID是一个整数。这里使用了try_into()
方法,它是 Rust 中一个通用的类型转换工具。uiautomation
库为Variant
实现了这个转换,让它可以被方便地转为i32
整数类型。println!("control type = {}", ctrl_type_id)
: 打印获取到的整数ID。例如,窗格(Pane)类型的ID通常是50033
。
- 获取是否启用(IsEnabled)属性:
root.get_property_value(UIProperty::IsEnabled).unwrap()
: 使用UIProperty::IsEnabled
来查询元素当前是否处于可用状态。let enabled_str: String = enabled.try_into().unwrap()
: “IsEnabled”属性的底层值是一个布尔值(true
或false
)。有趣的是,Variant
也可以通过try_into()
转换为String
。在这种情况下,布尔值true
会被转换为字符串"true"
。虽然也可以直接转换为bool
类型,但代码在这里展示了转换为字符串的灵活性。println!("enabled = {}", enabled_str)
: 打印转换后的字符串 "true" 或 "false"。对于桌面根元素,它几乎总是启用的。
# 总结
这段代码的核心是演示 get_property_value
方法的用法,以及如何处理返回的 Variant
类型。
它告诉我们:
- 如何查询特定属性:通过向
get_property_value
方法传入不同的UIProperty
枚举成员,可以获取任何你需要的属性。 - 如何处理返回结果:返回的
Variant
类型需要根据你所查询属性的预期数据类型,使用合适的方法(如get_string()
)或通用的转换(try_into()
)来提取具体的值。
与上一个遍历整个 UI 树的代码相比,这段代码更加关注于对单个元素的深度检查。在实际的 UI 自动化任务中,你通常会先遍历找到目标元素,然后再用类似这段代码的方式去查询或验证它的具体属性。
上次更新: 2025/08/19, 08:47:47
← 打印所有用户界面元素 模拟键盘输入→