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

S.H*_*oor 5 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);


        }
Run Code Online (Sandbox Code Playgroud)

它在elementNode.GetClickablePoint().X中抛出一个异常,即Autumation Element没有可点击的点.

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

我使用VS2012和.net 4.5

有没有办法做到这一点?

小智 5

正如已经建议的那样,我强烈建议将Inspect SDK工具指向您感兴趣的UI.工具(inspect.exe)可以在"C:\ Program Files(x86)\ Windows Kits\8.1"等地方找到.\BIN\64" .

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

在此输入图像描述

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

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

在此输入图像描述

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

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

谢谢,

家伙


IIn*_*ble 2

菜单栏不公开 InvokePattern 请参阅菜单栏控件类型的 UI 自动化支持)。但是,可以调用菜单项(请参阅MenuItem 控件类型的 UI 自动化支持)。

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

AutomationElementCollection items = menubar.FindAll(
    TreeScope.Children,
    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuItem));
Run Code Online (Sandbox Code Playgroud)