在 Windows 10 上具有多个虚拟桌面的 C# UI 自动化 API

Posted

技术标签:

【中文标题】在 Windows 10 上具有多个虚拟桌面的 C# UI 自动化 API【英文标题】:C# UI Automation API with multiple virtual desktops on Windows 10 【发布时间】: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 应用程序必须在与自动化应用相同的桌面。 【参考方案1】:

据我所知,托管的“System.Windows.Automation”库是旧的,并且早于在 Windows 中实现的多个桌面。

您应该尝试使用 Windows 8 中引入的新自动化 api。遗憾的是,它不是托管的,但是有一个名为 FlaUI 的出色库,使其与托管库一样易于使用(请务必使用 FlaUI.UIA3不是 FlaUI.UIA2 使用它来使用新的 api)。

如果您不想要一个完整的库,那么有一个用于新 com api 的 nuget 包装器(我认为来自 FlaUI 背后的同一个人)。

祝你好运。

【讨论】:

以上是关于在 Windows 10 上具有多个虚拟桌面的 C# UI 自动化 API的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 10 的任务栏中删除窗口

如何用Mac远程桌面连接windows,不用装虚拟机

VMware上新建windows 10 虚拟机

VMware上新建windows 10 虚拟机

急急急!!高分悬赏,windows 2008远程桌面连接问题

windows 10常用快捷键举例