1

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

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

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

但几天前我意识到了一些事情......当我将一个 vb6 文本框拖到表单中时,“名称”属性“文本”属性都设置为“文本 1”

因此,当我使用以下内容进行搜索时: 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. 我查看了很多不同的站点,下面列出了主要的站点-虽然有些人说他们已经设法让它工作了-我不相信我能看到他们是如何做到的..或者我只是不明白:$

http://blogs.msdn.com/b/brianmcm/archive/2006/01/17/getting-the-winforms-id-of-a-control.aspx

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

我打算从这里做的是根据它们在表单上的位置来获取自动化元素..

谢谢

4

2 回答 2

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 窗口中用您需要的确切信息进行注释,我会给您更好的代码。

于 2013-07-05T14:50:49.513 回答
0

您可以使用特定(或任何其他容器)中的关系位置来检测它例如,如果您的主窗口中有 5,并且您确定顺序不会更改,则可以在类名上创建 a,然后使用该方法返回s 的集合并遍历它,查询属性以找出哪个是最低的(或中间的,或任何其他位置,就此而言)。AutomationElementWindowTextBox AutomationElementsPropertyConditionTextBoxFindAllAutomationElementBoundingRectangle

我将创建一个辅助方法,该方法将返回 a Dictionary<int,AutomationElement>,键是 的视觉位置,AutomationElement值是AutomationElement自身。

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

于 2013-07-10T19:00:34.867 回答