UI Automation 的 FindFirst 只会返回第一个匹配的元素 ,如果你有多个符合条件的 "窗格",就需要用 FindAll 来获取所有匹配项,然后选择第 2 个,再在它下面继续查找子元素。
1. 基本思路
- 找顶层窗口 (
bfMain) - 用
FindAll获取所有窗格 - 取第 2 个窗格(索引为 1,因为集合是 0 起始)
- 在第 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 个窗格的子元素就可以一行代码搞定。