【发布时间】:2017-08-10 03:56:01
【问题描述】:
在这个论坛中有一些使用IUIAutomation 和VBA 的意图。但是所有这些都依赖于您知道类的名称以在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 -> AutoIt Window Info) https://www.autoitscript.com/site/autoit/ 允许您单击窗口并获取处理程序/类/名称详细信息。
很难缩小到我们想要点击的元素。此代码允许您这样做
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
h1 和FindWindow 允许您缩小范围以获取 IE 窗口的句柄(以及 SAVE 按钮)
有没有人有比这更好的方法?.. 因为在这里我只是循环通过 #32770 下的处理程序等待获取 SAVE 按钮。它确实有效,但我希望它应该是一种系统/有效的方式来了解如何在IUIAutomation 中使用正确的处理程序
【问题讨论】:
标签: vba excel ui-automation hwnd