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. 如果窗格数量可能很多

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

示例:

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

✅ 总结:

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

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

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

相关推荐
Julien20042 小时前
管理 Ansible 配置文件
linux·运维·服务器·ssh·学习方法
MicrosoftCloud2 小时前
性能排查 01|free 显示内存用了 90% 就是快满了吗?buff/cache 与 available 一次讲清
linux·运维·内存·free·buff/cache
灯澜忆梦2 小时前
【docker】#1 | Docker 初识
运维·docker·容器
风寄巴山秋3 小时前
OpenBMC:Web 页面功能异常排查
运维·服务器·前端·架构
小白的码BUG之路3 小时前
Jenkins -- 连接gitee
运维·gitee·jenkins
峥无3 小时前
Linux线程深度剖析:轻量级进程、虚拟内存分页、进程线程资源对比
linux·运维·mmap
袁袁袁袁满4 小时前
AI Agent 如何“看懂“互联网?
爬虫·python·自动化·爬虫实战·多线程爬虫
骑着蜗牛撵大象3274 小时前
穿越 Docker 内核迷雾:镜像分层的叠加态与卷挂载的空间穿梭
运维·docker·容器·联合文件系统·卷挂载·镜像分层·存储驱动
honsor4 小时前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
zxcvb1534 小时前
规定备份信息的备份方式:从策略制定到自动化落地的实践思考
运维·oracle·自动化