6

我正在尝试获取一个 WinTable 对象并将其转换为它的本机对象类型,如下所示:

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

CustomControl然后我想像在我的程序的源代码中那样对待结果control.DoAThing(),我已经引用了包含CustomControl该类的 .dll,但问题是它.NativeElement;返回的是一个类型Object[]而不是函数Object定义所说的那样.

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

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

4

2 回答 2

0

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

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;
}
于 2013-06-19T13:38:32.913 回答
0

NativeElement 获取底层自动化技术使用的对象。

如果您使用的是 WinForms,NativeElement 将返回一个 object[],其中第一个索引是 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 对象类。

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

于 2018-04-02T23:44:01.620 回答