通过其句柄将 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