使用UIAutomation确定窗口是否打开

时间:2017-12-04 13:36:21

标签: excel vba ui-automation

我正在编写一个excel插件,输出一个边缘列表和一个graphml工作表,稍后程序yED使用它来为插件的整体输出制作图形的位图。我使用shell命令在yED中打开相应的文件,并使用UIAutomation将命令发送到yED。

当有一个yED窗口已经打开时,代码执行得很好。轮询找到该窗口,然后设置为活动状态并发送命令。出错的地方是shell命令导致启动yED的新窗口。 yED有一个启动画面,因为它正在加载,需要几秒钟才能通过,并且与我正在寻找的窗口共享相同的名称和类。 HWND在两者之间是不同的。

只要有新的yED启动窗口,我的代码就会出错。错误如下:

  

运行时错误'-2147467259(80004005)':自动化错误未指定   错误

参考代码:

Function FindyEdByClass() As IUIAutomationElement
    Dim oUIAutomation As New CUIAutomation
    Dim oUIADesktop As IUIAutomationElement
    Dim allChilds As IUIAutomationElementArray
    Dim oUIAyED As IUIAutomationElement
    Dim i As Integer
    Dim Timer As Date

    Set oUIADesktop = oUIAutomation.GetRootElement
    Set oUIAyED = oUIADesktop
    Timer = Now
RestartLoop:
    Set allChilds = oUIADesktop.FindAll(TreeScope_Children, oUIAutomation.CreateTrueCondition)
    Debug.Print "StartLoop" & vbCrLf;
    For i = 0 To allChilds.Length - 1
        'EDIT: the following line is the one that errors out.
        If allChilds.GetElement(i).CurrentName = "Graph.graphml - yEd" And allChilds.GetElement(i).CurrentClassName = "SunAwtFrame" Then
            Debug.Print "Found Child - yED" & vbCrLf;
            Set oUIAyED = allChilds.GetElement(i)
        End If
    Next
    If Now() > (Timer + TimeValue("00:00:10")) Then GoTo NoyED
    If oUIAyED.CurrentName = "Desktop" Then GoTo RestartLoop
EndOFLoop:
    Debug.Print oUIAyED.CurrentName & " " & oUIAyED.CurrentClassName & vbCrLf;
    Set FindyEdByClass = oUIAyED
Exit Function
NoyED:
    MsgBox "No yED Window Found"
    End
End Function

它在If语句中出错的行。通过使用Debug.Print和FindWindowEx,我发现它出错的对象不是我正在寻找的yED窗口,而是它之前的yED启动画面。我假设错误是由于加载时间结束后闪屏消失引起的。

在这种情况下,如何找到我正在寻找的窗口?我需要能够找到窗口而不会看到会导致错误的启动画面,我需要能够通过类或名称之外的其他东西来区分这两者。

注意:我想通过HWND比较窗口,但我不知道如何在没有类/名称的情况下找到它,并且两次运行之间永远不会相同。

0 个答案:

没有答案