C# Windows UIAutomation有时会挂起其他应用程序

C# Windows UIAutomation有时会挂起其他应用程序,c#,com,ui-automation,microsoft-ui-automation,C#,Com,Ui Automation,Microsoft Ui Automation,我在WPF客户端应用程序中通过COM接口使用UIAutomation。一些用户有时会挂起他们的特定应用程序(如nVidia控制面板)。我的应用程序收到该异常: System.Runtime.InteropServices.COMException(0x80131505):操作 超时。(来自HRESULT的异常:0x80131505) 在UIAutomationClient.IUIAutomationeElement.FindAll(树范围, IUIAutomation条件) 我无法在我的电脑上复

我在WPF客户端应用程序中通过COM接口使用UIAutomation。一些用户有时会挂起他们的特定应用程序(如nVidia控制面板)。我的应用程序收到该异常:

System.Runtime.InteropServices.COMException(0x80131505):操作 超时。(来自HRESULT的异常:0x80131505) 在UIAutomationClient.IUIAutomationeElement.FindAll(树范围, IUIAutomation条件)

我无法在我的电脑上复制此内容

  • 你有处理这类问题的经验吗
  • 你有解决这种情况的办法吗
  • 我可以减少COM超时吗?也许这会解决问题

我找到了一些关于这个问题的信息

  • UIAutomation仅在具有创建者更新()的Windows 10上不稳定
  • 这是bug,已经提交了
  • NickAb找到了一个解决方案:使用
    TreeWalker
    ()
FindAll
FindFirst
都容易出现这种异常,这是 尝试在
WebView
中查找已加载其 最近,当方法尝试构建缓存时会引发异常,所以 这可能是由于尝试在可视化树运行时对其进行迭代 由另一个线程重建

FindAll
替换为

private IEnumerable<WiniumElement> GetChildrens()
{
    var elementNode = TreeWalker.ControlViewWalker.GetFirstChild(this.AutomationElement);

    while (elementNode != null)
    {
        yield return new WiniumElement(elementNode);
        elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
    }
}
private IEnumerable GetChildrens()
{
var elementNode=TreeWalker.ControlViewWalker.GetFirstChild(this.AutomationElement);
while(elementNode!=null)
{
返回新的WiniumElement(elementNode);
elementNode=TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
}
}
解决了这个问题。需要进一步调查。我们很可能会 必须将
FindFirst
FindAll
调用都替换为自定义
TreeWalker
迭代法

这将解决无法获取的页面源的问题 使用
WebView
s的视图,但无法在
WebView
s中找到元素 由于同样的错误