VB6 UIAutomation 自动化查找元素

UI Automation 的 FindFirst 只会返回第一个匹配的元素 ,如果你有多个符合条件的 "窗格",就需要用 FindAll 来获取所有匹配项,然后选择第 2 个,再在它下面继续查找子元素。


1. 基本思路

  1. 找顶层窗口bfMain
  2. FindAll 获取所有窗格
  3. 取第 2 个窗格(索引为 1,因为集合是 0 起始)
  4. 在第 2 个窗格中找子元素 (例如 toolStrip

2. VB6 示例代码

vbnet 复制代码
Option Explicit

Private Sub Command1_Click()
    Dim UIA As CUIAutomation
    Dim root As IUIAutomationElement
    Dim topElement As IUIAutomationElement
    Dim paneElements As IUIAutomationElementArray
    Dim paneElement As IUIAutomationElement
    Dim toolStripElement As IUIAutomationElement
    Dim paneCount As Long
    
    Set UIA = New CUIAutomation
    Set root = UIA.GetRootElement
    
    ' 1. 找顶层窗口
    Set topElement = root.FindFirst( _
        TreeScope_Descendants, _
        UIA.CreatePropertyCondition(UIA_AutomationIdPropertyId, "bfMain"))
    
    If Not topElement Is Nothing Then
        ' 2. 找所有窗格
        Set paneElements = topElement.FindAll( _
            TreeScope_Descendants, _
            UIA.CreatePropertyCondition(UIA_LocalizedControlTypePropertyId, "窗格"))
        
        paneCount = paneElements.Length
        If paneCount >= 2 Then
            ' 3. 取第 2 个窗格(索引 1)
            Set paneElement = paneElements.GetElement(1)
            
            ' 4. 在第 2 个窗格中找 toolStrip
            Set toolStripElement = paneElement.FindFirst( _
                TreeScope_Descendants, _
                UIA.CreatePropertyCondition(UIA_NamePropertyId, "toolStrip"))
            
            If Not toolStripElement Is Nothing Then
                MsgBox "找到第 2 个窗格下的 toolStrip: " & toolStripElement.CurrentName
            Else
                MsgBox "第 2 个窗格下未找到 toolStrip"
            End If
        Else
            MsgBox "找到的窗格数量不足 2 个"
        End If
    Else
        MsgBox "未找到 bfMain"
    End If
End Sub

3. 关键点说明

  • FindAll 返回 IUIAutomationElementArray,包含所有匹配条件的元素。

  • 索引 集合索引是 0 起始 ,所以第 2 个窗格的索引是 1

  • **TreeScope_Descendants**搜索范围是所有子孙元素,包括子控件、孙控件等。

  • 多条件匹配 如果 "窗格" 还需要额外条件(比如 Name),可以用 CreateAndConditionFromArray 组合条件。


4. 如果窗格数量可能很多

你可以先遍历所有窗格,输出它们的 CurrentNameCurrentAutomationId,这样方便确定哪一个是你要的第 2 个。

示例:

复制代码
Dim i As Long
For i = 0 To paneCount - 1
    Debug.Print i & ": " & paneElements.GetElement(i).CurrentName
Next

✅ 总结:

  • FindAll 获取所有窗格
  • 用索引选择第 2 个窗格
  • 再在该窗格下用 FindFirstFindAll 查找子元素

如果你愿意,我可以帮你写一个 通用的按层级查找函数,可以一次传入多个条件数组,自动定位到第 N 个元素,然后继续找它的子元素。这样你查找复杂界面会非常方便。

你要我帮你做这个通用查找函数吗?这样你以后查找第 2 个窗格的子元素就可以一行代码搞定。

相关推荐
三言老师36 分钟前
K8s集群运行时自动化运维全覆盖落地实操(下)
linux·运维·服务器·网络
躺不平的理查德3 小时前
嵌入式 Linux 系统移植与 SD 卡量产镜像制作
linux·运维·服务器
一直走下去-明4 小时前
centos7无法安装tcpreplay
linux·运维
IT大白鼠4 小时前
n8n工作流自动化平台技术架构与应用价值评估
运维·架构·自动化·n8n
志栋智能4 小时前
安全超自动化:构建全方位安全可观测性的基础
网络·安全·自动化
anxiao_m5 小时前
园区数字孪生怎么搭建?主流方案与服务商深度对比
大数据·运维·人工智能
时空无限5 小时前
ubuntu dpkg -l 输出第一列解释
linux·运维·ubuntu
Splashtop高性能远程控制软件5 小时前
AI 落地的连接基建评估:消费品行业远程连接方案的四个技术维度(性能 / 精度 / 安全 / 统一管理)
运维·人工智能·安全·远程工作·splashtop
ITyunwei09876 小时前
技术管理者视角:AI 重构 ITSM 的四个工程化落点
运维·人工智能
梦想的旅途28 小时前
企业微信API如何发送消息到客户群?群机器人限制说明
机器人·自动化·企业微信·rpa