【发布时间】:2021-11-08 00:55:06
【问题描述】:
警告,作为几天前从未使用过 C# 的人,我遇到了这个问题...
我正在尝试编写一个“简单”程序,从目标窗口中抓取文本并将其显示在 2x20 VFD 显示器上。我已经了解了如何使用 Microsoft UI 自动化 API,并且在使用它来实现我的目标方面取得了一些成功。
但是,如果目标窗口位于不同的虚拟桌面上,似乎在 AutomationElement.RootElement 上使用 TreeWalker 将找不到目标。
我现在用来获取目标窗口的代码(当它在同一个虚拟桌面上时):
public static AutomationElementCollection FindByMultipleConditions(AutomationElement anElement)
{
if (anElement == null)
{
throw new ArgumentException();
}
Condition conditions = new AndCondition(
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Pane),
new PropertyCondition(AutomationElement.IsContentElementProperty, true),
new PropertyCondition(AutomationElement.IsControlElementProperty, true),
new PropertyCondition(AutomationElement.IsKeyboardFocusableProperty, false),
new PropertyCondition(AutomationElement.IsEnabledProperty, true),
new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_0")
);
AutomationElementCollection elementCollection =
anElement.FindAll(TreeScope.Children, conditions);
return elementCollection;
}
一个 AutomationElement.RootElement 被传递给此方法,这似乎足够细化,可以始终以我感兴趣的特定窗口为目标,但如果我的目标窗口移动到不同的虚拟桌面,它不会返回任何内容。
这是使用 UI 自动化 API 完成任务的限制吗?有没有办法在搜索我的目标窗口时遍历每个虚拟桌面,或者我应该尝试不同的方法来解决这个问题?
谢谢!
【问题讨论】:
-
第一次听说,但并非不可思议。只需使用另一个已知良好的工具尝试此操作,使用 Inspect.exe SDK 实用程序并告诉我们您看到的情况。 Example.
-
让我印象深刻的是,inspect.exe 中树的顶部是“Desktop 3”窗格,目标窗口当前所在的位置。另一个已知的好工具是什么意思?就 UI 自动化 API 而言,似乎每个虚拟桌面都是自己的“树”……
-
您可能应该实现IVirtualDesktopManager 并使用它的
::MoveWindowToDesktop()来枚举当前VDesktop 中的顶级窗口。 -
对。此处提供免费示例 C# 代码:VirtualDesktop - GitHub
-
如果您正在谈论 Windows 10 新的虚拟桌面功能并且没有混淆桌面和显示器,UIAutomation 的根节点对应于当前虚拟桌面,因此您的 UIA 应用程序必须在与自动化应用相同的桌面。
标签: c# windows winapi ui-automation