我有一个应用程序可以在任意Windows应用程序上执行某些自动化操作。我一直在用记事本来测试它。
在此自动化期间,我必须从代码中调用事件。我目前支持两种类型的活动,因为它们似乎是最常见的,InvokePattern和ExpandCollapsePattern。
我使用可以远程桌面的计算机进行测试。但这很奇怪。当我通过远程桌面连接到计算机时,应用程序正常工作。当我从计算机断开连接时,我的代码停止为ExpandCollapsePattern工作(InvokePattern工作正常)。我得到一个InvalidOperationException。
文档说只有在节点被标记为LeafNode时才会抛出此内容。是什么让远程桌面与我获得InvalidOperationException不同?
以下是我目前要执行此事件的代码。
ExpandCollapseState state =
patternMenu.Current.ExpandCollapseState;
if (state == ExpandCollapseState.Expanded)
patternMenu.Collapse();
else if (state == ExpandCollapseState.PartiallyExpanded ||
state == ExpandCollapseState.Collapsed)
patternMenu.Expand();
patternMenu是使用GetCurrentPattern从AutomationElement获取的ExpandCollapsePattern。
当我打印出值时,ExpandCollapseState的当前值为“Collapsed”。
编辑:我有机会知道为什么我有一个downvote以及这是一个糟糕的问题?我对发生的事情感到非常困惑,因为当远程桌面关闭时它似乎只会失败。如果这是一个非常愚蠢的问题,我应该知道答案,我会喜欢一个解释,然后是一个downvote。与桌面交互的进程不是Windows服务。这是我将远程桌面插入计算机后启动的应用程序。是因为我要锁定桌面吗?
我在Ubuntu上使用“终端服务器客户端”登录Windows机器。按此应用程序上的关闭按钮会导致桌面锁定吗?
答案 0 :(得分:2)
一般来说,您通常无法在非交互式桌面上运行UI自动化或类似功能。非交互式桌面在输入方面有各种限制:没有聚焦元素,无法发送输入,因此依赖于这些内容的任何内容都将失败。
某些功能(例如发送Windows消息)可以正常工作。这里可能发生的是InvokePattern功能作为消息在封面下实现,因此仍然有效;但是扩展/折叠可能会根据输入实现,这会失败。
不清楚为什么,在你的情况下,当你关闭客户端时失败(那部分是预期的),但是 似乎在远程桌面锁定自身时起作用 - 在两种情况下它都会表现出相同的行为。
(请注意,如果本地 Ubuntu桌面锁定,只要客户端仍在运行,一切都应该没问题仍然有效。在这种情况下,远程客户端仍然是“交互式的”,因为它是无论客户端本身是在交互式还是非交互式桌面上运行,都有一个连接到它的实时客户端 - 这些概念甚至可能不适用于在另一个操作系统上运行的客户端!)