在没有InvokePattern或clickablePoint的情况下使用UI Automation调用单击按钮

时间:2015-08-04 15:41:05

标签: c# winapi ui-automation

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

我使用了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 Element没有可点击的点。

我也试过TryGetInvokePattern()但仍然抛出execption它没有InvokePattern。

我使用VS2012和.net 4.5

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

正如已经建议的那样,我强烈建议将Inspect SDK工具指向您感兴趣的UI。工具(inspect.exe)可以在&#34; C:\等地方找到程序文件(x86)\ Windows Kits \ 8.1 \ bin \ x64&#34;。

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

enter image description here

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

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

enter image description here

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

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

谢谢,

答案 1 :(得分:2)

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

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

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