【发布时间】: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