UI从.NET自动化VB6应用程序

时间:2012-12-18 21:58:59

标签: vb6 controls ui-automation

在过去的几天里,我一直在努力找出为vb6应用程序中的特定控件获取AutomationElement的最佳方法。

我最初这样做的方法是使用以下条件进行搜索: new PropertyCondition(AutomationElement.NameProperty, controlName

我假设这在一个小小的测试VB6应用程序中正常工作了大约一周。

但是几天前我意识到了什么......当我将vb6文本框拖到表单中时,'Name'属性'Text'属性都被设置为'Text1'

所以当我搜索时: new PropertyCondition(AutomationElement.NameProperty,'Text1')
它会返回正确的元素,但是如果我然后将'Text'属性设置为'',则相同的搜索将不会带来任何回复。

问题:有没有人找到基于VB6控件名称获取AutomationElement的方法

我尝试了什么:

  1. 获取MSAA等效界面并查看“名称”属性 - 结果:'' http://msdn.microsoft.com/en-us/library/windows/desktop/dd318490%28v=vs.85%29.aspx
  2. 基于其他属性获取控件(AutomationId,RuntimeId) - 结果:AutomationId - 并非所有控件似乎都具有此属性 - RuntimeId - 每次应用程序运行时都会更改
  3. 我看过很多不同的网站,下面列出了主要网站 - 有些人说他们设法让它运转起来 - 我不相信我能看到他们是怎么做的......或者我只是不理解它: $
  4. http://blogs.msdn.com/b/brianmcm/archive/2006/01/17/getting-the-winforms-id-of-a-control.aspx

    虽然我可以访问演示应用程序,但我不会访问由第三方创建的生产应用程序。

    我打算从这里做的是根据他们在表单上的位置获取Automation元素。

    谢谢

2 个答案:

答案 0 :(得分:0)

由于低代表无法发表评论。你绝对必须拥有AutomationElement吗?

您可能想要查看调用[user32.dll](http://pinvoke.net/default.aspx/user32.EnumChildWindows)。查看FindWindowEx,GetWindow,EnumWindows,EnumChildWindows,GetWindowText等。

您需要父窗口的句柄,因此您可以使用此循环来获取它。从那里,您可以使用其他功能来获取有关控件的信息。

        IntPtr hWnd = IntPtr.Zero;
        foreach(var process in System.Diagnostics.Process.GetProcesses())
            if(condition)
                hWnd = process.Handle;

在VB6窗口中评论您需要的确切信息,我会为您提供更好的代码。

答案 1 :(得分:0)

您可以在特定AutomationElement(或任何其他容器)中使用Window关系位置,以便检测它。例如,如果您的主窗口中有5个TextBox AutomationElements,并且您确定订单不会更改,则可以在{{1}上创建PropertyCondition } class name,然后使用TextBox方法返回FindAll s的集合并遍历它,查询AutomationElement属性以找出哪个是最低的(或中间的,或任何其他职位,就此而言)。

我会创建一个辅助方法,返回BoundingRectangle,其中键是Dictionary<int,AutomationElement>的视觉位置,值是AutomationElement本身。

通过这种方式,您可以避免在屏幕上使用特定的AutomationElement(任何窗口大小更改或元素定位都会轻易破坏您的代码),而不会绑定到Point属性。