【问题标题】:Invoke on click on a button using UI Automation with no InvokePattern or clickablePoint使用没有 InvokePattern 或 clickablePoint 的 UI 自动化在单击按钮时调用
【发布时间】:2015-08-11 21:44:39
【问题描述】:

我正在尝试将点击消息发送到(或调用)另一个应用程序中的按钮。

我使用了 UISpy.exe 并且可以找到我需要的元素。

但它没有 id、没有 clickablePoint 和没有 Invoke 模式。

我尝试了以下代码:

var processStartInfo = new ProcessStartInfo(@"tdesktop\Program.exe");
        var proc = Process.Start(processStartInfo);
        Thread.Sleep(3000);
        AutomationElement mainWin = AutomationElement.RootElement.FindChildByProcessId(proc.Id);
        List<AutomationElement> elmList= GetChildren(mainWin);
        //MessageBox.Show(elmList.Count.ToString());
        if (elmList.Count == 7)
        {
           List<AutomationElement> menubar= GetChildren(elmList[6]);

           AutomationElement elementNode = menubar[1];
           double x = elementNode.GetClickablePoint().X;
           double y = elementNode.GetClickablePoint().Y;

           win32 w = new win32();
           w.move_left_click((UInt32)x, (UInt32)y);


        }

它在 elementNode.GetClickablePoint().X 中抛出 Autumation 元素没有可点击点的异常。

我也试过 TryGetInvokePattern() 但仍然抛出没有 InvokePattern 的执行。

我使用 VS2012 和 .net 4.5

有什么办法可以做到吗?

【问题讨论】:

  • 很抱歉,因为在标题中输入错误:使用 UI 自动化调用或单击按钮,没有 InvokePattern 或 clickablePoint
  • 您是在谈论菜单栏(如您的代码所示)还是按钮控件(如标题所示)?尝试使用 Inspect.exe(Windows SDK 的一部分),并启用 Options -> Watch Cursor。使用定点设备导航标准菜单栏,菜单项返回 trueIsInvokePatternAvailable
  • 我在 Windows SDK 中找不到 inspect.exe。但我使用了 UISpy。查询 IsInvokePatternAvailable 它返回 true。但是在对 InvokePattern 进行查询时,它返回 null。坦率地说,我正在尝试调用 Telegram 的菜单。
  • UISpy 已弃用。 Inspect 与适用于 Windows 8 的 Windows SDK 一起安装。由于Telegram 使用 Qt 实现其 GUI,它应该公开所有必需的 UI 自动化接口。
  • 我可以在 Windows 7 上安装 Inspect 吗?

标签: c# winapi ui-automation


【解决方案1】:

正如已经建议的那样,我强烈建议将 Inspect SDK 工具指向您感兴趣的 UI。该工具 (inspect.exe) 位于“C:\Program Files (x86)\Windows套件\8.1\bin\x64"。

通过使用该工具,您可以看到感兴趣的 UI 元素是如何以编程方式公开的。例如,它是作为单个 UIA 元素公开的,还是作为一个更大的 UIA 元素的一部分,该元素代表一组直观地显示的 UI 元素,它支持哪些 UIA 模式?作为测试,我只是将 Inspect 指向 Paint 中的箭头形状。结果如下所示。

所以我可以看出箭头以编程方式作为单个 UIA 元素公开,并且它支持 Invoke 模式。这意味着我可以通过 UIA 以编程方式调用按钮。 (而且我可以从 Inspect 的 Action 菜单中调用元素上的模式方法,这非常方便。)如果 UIA 元素不支持任何允许我以编程方式控制它的模式,我可以通过 UIA 找到它的 BoundingRectangle 属性,并在其中模拟鼠标单击以调用它。 (而且我假设当我模拟鼠标点击时按钮没有被遮挡。)

但是,如果我查看屏幕上直观显示的另一组元素,使用 Inspect 我可以了解到整个集合通过 UIA 作为单个 UIA 元素公开。因此,在下面显示的 Inspect 图像中,我可以了解到我无法以编程方式调用该组中的特定颜色。

所以在这种情况下,我可能不得不假设我知道该组中直观显示的 UI 元素的大小和布局,并根据我想要的颜色在我认为合适的某个点模拟鼠标点击调用。

通过使用 Inspect,我可以很好地了解我的选项是什么。理想情况下,屏幕上直观显示的单个元素将通过 UIA 作为单个元素公开,我可以通过任何相关的模式(例如,Invoke、Toggle、SelectionItem 等)来控制它。但如果不支持有用的模式,那么我可以考虑基于任何 ClickablePoint 或 BoundingRectangle 数据的暴露来模拟鼠标点击。

谢谢,

男人

【讨论】:

    【解决方案2】:

    菜单栏不显示InvokePattern(请参阅UI Automation Support for the MenuBar Control Type)。但是,菜单项可以是Invoked(请参阅UI Automation Support for the MenuItem Control Type)。

    以下代码说明了如何生成菜单项列表:

    AutomationElementCollection items = menubar.FindAll(
        TreeScope.Children,
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuItem));
    

    【讨论】:

    • 但这对我不起作用,我试过但无法获得菜单项。即使使用 UISpy.exe,该程序也没有 InvokePattern 或可点击点。
    猜你喜欢
    • 2016-04-23
    • 2014-04-28
    • 2012-06-28
    • 2012-09-17
    • 1970-01-01
    • 2013-09-09
    • 2022-10-31
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多