WinControl的本机对象类?

时间:2013-06-11 15:06:06

标签: c# .net-4.0 coded-ui-tests

我正在尝试获取WinTable对象并将其转换为其本机对象类型:

CustomControl control = (CustomControl) this.UIMap.UIMainWindow.UICustomControl.NativeElement;

然后我想像我在CustomControl这样的程序的源代码中处理生成的control.DoAThing(),我已经引用了包含CustomControl类的.dll但问题是.NativeElement;返回的是Object[]类型,而不是像definition of the function所说的那样Object

.NativeElement是走的路还是我误解了它的目的?

更新:我检查了结果Object[]中对象的类型,第一个是System.__ComObject类型,第二个是System.Int32但是我我不确定这些代表什么...

2 个答案:

答案 0 :(得分:0)

如果您发布了CustomControlUICustomControl课程的代码,将会很有帮助。根据我对您的问题的模糊理解,以下内容可能有效:尝试并发布结果。

object[] native = 
  this.UIMap.UIMainWindow.UICustomControl.NativeElement as object[];
if ((native[0] != null) && (native[0] is IAccessible)) {
    IAccessible a = native[0] as IAccessible;
    if (a is CustomControl)
        CustomControl control = (CustomControl)a;
}

答案 1 :(得分:0)

NativeElement获取底层Automation Technology使用的对象。

如果您正在使用WinForms,NativeElement将返回一个对象[],其中第一个索引是IAccessible。我相信任何其他价值观都将成为MSAA使用的子女,但我从未亲自使用它们。

public static IAccessible AsIAccessible(this WinControl control)
{
    var native = control.NativeElement as object[];
    return native[0] as IAccessible;
}

如果您正在使用WPF,NativeElement将返回一个AutomationElement。

public static AutomationElement AsAutomationElement(this WpfControl control)
{
    return control.NativeElement as AutomationElement
}

如果您使用的是Web,NativeElement将返回相应的mshtml界面

public static T AsNativeHtml<T>(this HtmlControl control) where T : HTMLElement
{
    return control.NativeElement as T
}

myDiv.AsNativeHtml<HTMLDivElement>()

但是,我不相信有一种方法可以在不以某种方式挂钩目标进程的情况下获取Native对象类。

我过去曾尝试制作hawkeye的自定义包装器。哪个是ui检查工具,可以获取和设置本机.Net属性。但是,由于复杂性和时间限制,我的成功有限。