我正在编写一个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比较窗口,但我不知道如何在没有类/名称的情况下找到它,并且两次运行之间永远不会相同。