获取并打印单个 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
← 打印所有用户界面元素 模拟键盘输入→