在过去的几天里,我一直在努力找出为vb6应用程序中的特定控件获取AutomationElement的最佳方法。
我最初这样做的方法是使用以下条件进行搜索: new PropertyCondition(AutomationElement.NameProperty, controlName )
我假设这在一个小小的测试VB6应用程序中正常工作了大约一周。
但是几天前我意识到了什么......当我将vb6文本框拖到表单中时,'Name'属性和'Text'属性都被设置为'Text1'
所以当我搜索时:
new PropertyCondition(AutomationElement.NameProperty,'Text1')
它会返回正确的元素,但是如果我然后将'Text'属性设置为'',则相同的搜索将不会带来任何回复。
问题:有没有人找到基于VB6控件名称获取AutomationElement的方法
我尝试了什么:
http://blogs.msdn.com/b/brianmcm/archive/2006/01/17/getting-the-winforms-id-of-a-control.aspx
虽然我可以访问演示应用程序,但我不会访问由第三方创建的生产应用程序。
我打算从这里做的是根据他们在表单上的位置获取Automation元素。
谢谢
答案 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
属性。