在没有InvokePattern或clickablePoint的情况下使用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 elmList= GetChildren(mainWin); //MessageBox.Show(elmList.Count.ToString()); if (elmList.Count == 7) { List 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中引发exception,即Autumation元素没有可点击的点。

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

我使用VS2012和.net 4.5

有没有办法做到这一点?

菜单栏不显示InvokePattern (请参阅MenuBar控件类型的UI自动化支持 )。 但是,菜单项可以是Invoke d(请参阅MenuItem控件类型的UI自动化支持 )。

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

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

正如已经建议的那样,我强烈建议将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数据公开的内容。

谢谢,

家伙