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

相关推荐
实心儿儿7 小时前
Linux —— 进程间关系和守护进程
linux·运维·服务器
FII工业富联科技服务7 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
WA内核拾荒者7 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
Dawn-bit8 小时前
Linux磁盘管理详解
linux·运维·服务器·计算机网络·云计算
RisunJan9 小时前
Linux命令-sftp(SSH 文件传输协议客户端)
linux·运维
FORCECON110 小时前
力控SCADA驱动 :告别传统寻址,EIP协议全新适配升级
自动化·驱动·scada·监控组态软件·采集监控平台
极客先躯10 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
三言老师12 小时前
CentOS7.9:Redis‑Cluster集群部署结构化实战教程
linux·运维·服务器·数据库
attitude.x13 小时前
Cursor+GitOps:自动化运维新姿势
运维·自动化
数智化管理手记14 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘