通过其句柄将 window 分配给对象
Assign window to object via its handle
只是在寻找一个指针,因为我正在努力寻找 material 在线...
是否有我可以在 VB.NET 中使用的库或参考资料,通过它的句柄将任意打开 window 分配给一个对象,这样我就可以查看与之关联的元素和属性window?我可以通过 Process.MainWindowHandle
(即 System.Diagnostics.Process.GetProcesses
)识别句柄,但我如何使用该句柄将 window 作为对象“挂钩”?
(仅供参考 window 独立于我的应用程序,它不是表单或类似的东西 - 它只是一个开放的 window)
我在网上找到的所有 material 都在告诉我如何获得句柄,但这不是问题;我 有 句柄,但我不知道如何使用它以编程方式“挂钩”到 window 上?
如果有人能提供任何指点,我们将不胜感激!
谢谢
铝
这是我找到的解决方案,它完全按预期工作。由于@Jimi 为我提供了所有必要的指示,因此不能声称它是我的功劳。但是,该代码段可能对其他像我一样第一次尝试导航 UI 自动化的人有所帮助。
Private Sub StartListening()
Try
Dim eventHandler As AutomationEventHandler = AddressOf OnWindowOpenOrClose
Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Subtree, eventHandler)
Catch ex As Exception
End Try
End Sub
Private Sub StopListening()
Try
Automation.RemoveAllEventHandlers()
Catch ex As Exception
End Try
End Sub
Private Sub OnWindowOpenOrClose(ByVal src As Object, ByVal e As AutomationEventArgs)
Dim sourceElement As AutomationElement
Dim okButton As AutomationElement
Dim okButtonCondition As Condition
Dim okButtonInvokePattern As InvokePattern
Try
sourceElement = DirectCast(src, AutomationElement)
If sourceElement IsNot Nothing Then
If sourceElement.Current.ControlType.Equals(ControlType.Window) AndAlso sourceElement.Current.ClassName = "NUIDialog" AndAlso sourceElement.Current.Name = "<Insert Dialog Name Here As Necessary>" Then
If e.EventId Is WindowPattern.WindowOpenedEvent Then
okButtonCondition = New AndCondition(New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button),
New PropertyCondition(AutomationElement.NameProperty, "OK"))
okButton = sourceElement.FindFirst(TreeScope.Subtree, okButtonCondition)
If okButton IsNot Nothing Then
okButtonInvokePattern = DirectCast(okButton.GetCurrentPattern(InvokePattern.Pattern), InvokePattern)
okButtonInvokePattern.Invoke()
End If
Return
End If
End If
End If
Catch
Return
End Try
End Sub
只是在寻找一个指针,因为我正在努力寻找 material 在线...
是否有我可以在 VB.NET 中使用的库或参考资料,通过它的句柄将任意打开 window 分配给一个对象,这样我就可以查看与之关联的元素和属性window?我可以通过 Process.MainWindowHandle
(即 System.Diagnostics.Process.GetProcesses
)识别句柄,但我如何使用该句柄将 window 作为对象“挂钩”?
(仅供参考 window 独立于我的应用程序,它不是表单或类似的东西 - 它只是一个开放的 window)
我在网上找到的所有 material 都在告诉我如何获得句柄,但这不是问题;我 有 句柄,但我不知道如何使用它以编程方式“挂钩”到 window 上?
如果有人能提供任何指点,我们将不胜感激!
谢谢
铝
这是我找到的解决方案,它完全按预期工作。由于@Jimi 为我提供了所有必要的指示,因此不能声称它是我的功劳。但是,该代码段可能对其他像我一样第一次尝试导航 UI 自动化的人有所帮助。
Private Sub StartListening()
Try
Dim eventHandler As AutomationEventHandler = AddressOf OnWindowOpenOrClose
Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Subtree, eventHandler)
Catch ex As Exception
End Try
End Sub
Private Sub StopListening()
Try
Automation.RemoveAllEventHandlers()
Catch ex As Exception
End Try
End Sub
Private Sub OnWindowOpenOrClose(ByVal src As Object, ByVal e As AutomationEventArgs)
Dim sourceElement As AutomationElement
Dim okButton As AutomationElement
Dim okButtonCondition As Condition
Dim okButtonInvokePattern As InvokePattern
Try
sourceElement = DirectCast(src, AutomationElement)
If sourceElement IsNot Nothing Then
If sourceElement.Current.ControlType.Equals(ControlType.Window) AndAlso sourceElement.Current.ClassName = "NUIDialog" AndAlso sourceElement.Current.Name = "<Insert Dialog Name Here As Necessary>" Then
If e.EventId Is WindowPattern.WindowOpenedEvent Then
okButtonCondition = New AndCondition(New PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button),
New PropertyCondition(AutomationElement.NameProperty, "OK"))
okButton = sourceElement.FindFirst(TreeScope.Subtree, okButtonCondition)
If okButton IsNot Nothing Then
okButtonInvokePattern = DirectCast(okButton.GetCurrentPattern(InvokePattern.Pattern), InvokePattern)
okButtonInvokePattern.Invoke()
End If
Return
End If
End If
End If
Catch
Return
End Try
End Sub