Xz's blog Xz's blog
首页
时间序列
多模态
合成生物学
其他方向
生活
工具相关
PyTorch
导航站

Xu Zhen

首页
时间序列
多模态
合成生物学
其他方向
生活
工具相关
PyTorch
导航站
  • Rust

  • Rust-Windows 窗口自动化

    • 打印所有用户界面元素
    • 获取并打印单个 UI 元素的特定属性
      • 模拟键盘输入
      • 捕获选择的文本
    • Tauri

    • C++

    • Claude Code

    • Liunx相关

    • Windows相关

    • IDE

    • Conda

    • Docker

    • VMware虚拟机

    • Python常用代码片段

    • 工具相关
    • Rust-Windows 窗口自动化
    xuzhen
    2025-08-18
    目录

    获取并打印单个 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

    输出:

    name = 桌面 1
    control type = 50033
    enabled = True
    
    1
    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
    1. UIAutomation::new().unwrap(): 与前一个例子一样,这行代码创建了一个 UIAutomation 客户端实例,用于后续的所有操作。
    2. automation.get_root_element().unwrap(): 获取代表整个桌面的根 UI 元素,作为查询属性的目标。

    1. 获取名称(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 中提取出字符串值并打印。

    1. 获取控件类型(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。

    1. 获取是否启用(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 类型。

    它告诉我们:

    1. 如何查询特定属性:通过向 get_property_value 方法传入不同的 UIProperty 枚举成员,可以获取任何你需要的属性。
    2. 如何处理返回结果:返回的 Variant 类型需要根据你所查询属性的预期数据类型,使用合适的方法(如 get_string())或通用的转换(try_into())来提取具体的值。

    与上一个遍历整个 UI 树的代码相比,这段代码更加关注于对单个元素的深度检查。在实际的 UI 自动化任务中,你通常会先遍历找到目标元素,然后再用类似这段代码的方式去查询或验证它的具体属性。

    #Rust
    上次更新: 2025/08/19, 08:47:47

    ← 打印所有用户界面元素 模拟键盘输入→

    最近更新
    01
    Linux 通过Windows代理上网
    09-18
    02
    vscode远程使用copilot和codex(内网环境)
    09-18
    03
    跨机器克隆环境
    09-18
    更多文章>
    Theme by Vdoing | Copyright © 2025-2025 Xu Zhen | 鲁ICP备2025169719号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式