我尝试将点击消息发送到(或调用)另一个应用程序中的按钮。
我使用了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
有没有办法做到这一点?
答案 0 :(得分:5)
正如已经建议的那样,我强烈建议将Inspect SDK工具指向您感兴趣的UI。工具(inspect.exe)可以在&#34; C:\等地方找到程序文件(x86)\ Windows Kits \ 8.1 \ bin \ x64&#34;。
通过使用该工具,您可以看到如何以编程方式公开感兴趣的UI元素。例如,它是作为单个UIA元素公开的,还是一个更大的UIA元素的一部分,它表示一组可视化的UI元素,它支持哪些UIA模式?作为测试,我只是指向Inspect中的一个箭头形状。结果如下所示。
所以我可以告诉箭头以编程方式暴露为单个UIA元素,并且它支持Invoke模式。这意味着我可以通过UIA以编程方式调用按钮。 (我可以在Inspect的Action菜单中调用元素上的模式方法,这非常方便。)如果UIA元素不支持任何允许我以编程方式控制它的模式,我可以找到它的BoundingRectangle属性通过UIA,并在其中间模拟鼠标点击以调用它。 (而且我假设当我模拟鼠标点击时按钮没有被遮挡。)
但是如果我看一下屏幕上可视化显示的另一组元素,使用Inspect我可以了解整个集合是通过UIA作为单个UIA元素公开的。因此,在下面显示的Inspect图像中,我可以了解到我无法以编程方式调用该组中的特定颜色。
所以在这种情况下,我可能不得不假设我知道该组中可视化显示的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));