【问题标题】:Microsoft UI Automation: Invoke Pattern ExceptionMicrosoft UI 自动化:调用模式异常
【发布时间】:2014-10-23 01:08:43
【问题描述】:

我正在尝试使用调用模式单击按钮。

InvokePattern ipAddMPButton = (InvokePattern)aeAddMPButton.GetCurrentPattern(InvokePattern.Pattern);
        try
        {
            ipAddMPButton .Invoke();
        }
        catch (System.Runtime.InteropServices.COMException e)
        {
            // TODO
        }

它抛出 COMException,我不知道为什么?

当我运行此代码时,实际按下了按钮并且功能运行良好。但随后它会停止一段时间,并抛出此异常。

【问题讨论】:

  • 另外,如果它实际上正在执行操作,那么为什么要担心捕获异常并按原样继续流程......这只是以防万一你没有得到坚如磐石的解决方案
  • 我实际上在尝试使用 UIAutomation 操作的应用程序中具有相同的行为。就我而言,这发生在打开 Winforms 对话框的 Winforms 按钮上(我相信它们可能是消息框)。调用线程恰好卡住 1 分钟,然后抛出异常“0x80040201 - 事件无法调用任何订阅者”。我已经使用 Inspect.exe 工具测试了这些按钮,虽然我看不到异常,但它表现出类似的行为,即在调用 Invoke 后冻结一分钟(尽管调用正确执行)。
  • 它是标准的 Winforms 按钮还是特殊的东西?你有任何复制代码吗? 0x80040201 是 UIA_E_ELEMENTNOTAVAILABLE,因此,这可能是赛车条件问题,例如(在应用程序中)的某些代码在您的 UIA 应用程序和目标应用程序之间的所有通信结束之前过早地破坏了按钮。
  • @SimonMourier 实际上按钮在新打开的对话框后面仍然可见,所以我猜它没有被破坏,但是,我怀疑因为这是一个模式对话框,应用程序的其余部分不是泵送消息,不能与之交互。可能它在将 Click() 调用的结果返回给 UIAutomation 线程之前就被锁定了?
  • 有可能,是的。它还可以改变其养育关系,这也可以破坏一些 UIA 内部运作。使用 UIA,没有任何保证,因为您的代码正在与并非专门设计用于与任何事物交互的“事物”进行交互。但是,如果您拥有目标应用程序,那应该会容易得多。

标签: ui-automation microsoft-ui-automation ui-patterns


【解决方案1】:

尝试检查 aeAddMPButton.GetAllSupportedPatterns() 然后尝试调用..

【讨论】:

  • 这有什么合理的解释,还是只是一种“敲木头”之类的魅力?
  • 调用 GetAllSupportedPatterns() 会返回元素的所有支持模式。当不支持异常或(在极少数情况下)未加载模式时,将引发上述异常。生成的列表确保您只遍历加载/支持的模式,从而避免引发无效模式异常的可能性
  • 您是对的,但我相信在这种情况下,问题不是不受支持的模式,而是按钮未从 Invoke 调用返回的情况,正如我在下面的回答中引用的那样。如果不支持该模式,则不会捕获异常,因为 GetCurrentPattern 会抛出异常并且它在 try 块之外。
  • 有道理。感谢分享!
【解决方案2】:

其实我发现这里已经讨论过了:https://social.msdn.microsoft.com/Forums/en-US/673bba3d-27b3-4374-b049-0d2e8ec5e462/hang-with-invokepattern-invoke-in-virtual-pc?forum=windowsaccessibilityandautomation。总而言之,Winforms 打开模式对话框并不能很好地与 UIAutomation 配合使用,因为它不会从 Invoke 命令返回,只会创建模式对话框,这当然会阻止它完成操作。建议的解决方案是产生一个后台线程并从该线程激活 Invoke(或任何其他操作)。我还建议对操作的完成强制执行某种超时,因为在某些情况下它可能会很长。

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多