使用IUIAutomation控制VBA中的任何SAVE按钮(或其他)

时间:2017-08-10 03:56:01

标签: vba excel-vba ui-automation hwnd excel

在此论坛中使用IUIAutomationVBA有一些意图。但是所有这些都依赖于这样一个事实:你知道要在FindWindowEx中使用它的类的名称。最受欢迎的是:

Controlling IE11 "Do you want to Open/Save" dialogue window buttons in VBA

hWnd = FindWindowEx(hWnd, 0, "Frame Notification Bar", vbNullString)

本网站中的代码可以帮助您了解PARENTS和CHILDRENS处理程序的关联方式 http://www.vbaexpress.com/kb/getarticle.php?kb_id=52

自动 - > AutoIt窗口信息) https://www.autoitscript.com/site/autoit/允许您单击窗口并获取处理程序/类/名称详细信息。

非常令人沮丧,很难缩小到我们想要点击的元素。这段代码允许你这样做

enter image description here

Sub test2()

Dim h1, h2 As Long
Dim sWindowName As String

    Dim AutomationObj As IUIAutomation
    Dim WindowElement As IUIAutomationElement
    Dim Button As IUIAutomationElement
    Dim hWnd As LongPtr

sWindowName = vbNullString

Set AutomationObj = New CUIAutomation

h1 = FindWindow("#32770", "Internet Explorer")

Debug.Print h1

While h1 <> 0

    h2 = FindWindowEx(h1, 0, vbNullString, sWindowName)

    If h2 <> 0 Then


       Set WindowElement = AutomationObj.ElementFromHandle(ByVal h2)
       Dim iCnd As IUIAutomationCondition
       Set iCnd = AutomationObj.CreatePropertyCondition(UIA_NamePropertyId, "Save")

       Set Button = WindowElement.FindFirst(TreeScope_Subtree, iCnd)
       Dim InvokePattern As IUIAutomationInvokePattern

       If Button.CurrentName = "Save" Then
            Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
            InvokePattern.Invoke
            h1 = 0

     Else

        h1 = h2
       End If


    Else
        h1 = 0
    End If

    Debug.Print h2

Wend

End Sub

h1FindWindow允许您缩小以获取IE窗口的句柄(以及SAVE按钮)

有没有人有这样的击球手方法?因为在这里我只是在#32770下循环处理器等待获得SAVE按钮。它确实有效,但我应该是一种系统/有效的方式来理解如何在IUIAutomation中使用正确的处理程序

1 个答案:

答案 0 :(得分:0)

通过inspect.exe可以通过多种方式查看确定元素的方法。在示例部分的autoit中,您可以找到许多有关如何处理ms uia的示例。您可以使用createtruecondition从getrootelement开始过滤,该创建条件也适用于vba。然后,您将获得桌面元素的所有主窗口。