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 个窗格的子元素就可以一行代码搞定。

相关推荐
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅3 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒3 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器
zhangfeng11333 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh
ZeroNews内网穿透3 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全
失重外太空啦3 天前
nginx
运维·nginx
Gofarlic_oms13 天前
避免Kisssoft高级分析模块过度采购的科学评估方法
大数据·linux·运维·人工智能·matlab
田井中律.3 天前
服务器部署问题汇总(ubuntu24.04.3)
运维·服务器
大大水瓶3 天前
HAProxy 从入门到实战:负载均衡与流量管理全解析
运维·负载均衡