Delphi:缺少UI Automation方法的接口声明

时间:2014-07-28 22:03:16

标签: delphi ui-automation microsoft-ui-automation typelib

这个基本问题,但我被困了......

我正在尝试在Windows 7上使用Delphi 2007(Win32)开始使用UI Automation。似乎我没有声明我需要使用的某些方法和类型。我在这台机器上安装了.NET Framework 4.x,但我从UIAutomationClient_TLB中的C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ UIAutomationClient.dll ...导入了一个类型库。我看到的是:

UIAutomationClientMajorVersion = 1;
UIAutomationClientMinorVersion = 0;

我不确定这是不是问题(错误的版本)。我可以毫无问题地声明以下内容:

var
  UIAuto: IUIAutomation;
  Element: IUIAutomationElement;

但是IUIAutomationElement的方法似乎缺失了。例如,界面中没有任何内容声明该方法:

    IUIAutomationElement.TryGetCurrentPattern()

...根据msdn.microsoft.com的说法,这是一种至少可以追溯到.NET 3.0的接口方法。

在哪里/如何获得必要的接口声明?这可能是注册问题吗?如果是,需要注册什么,以及如何?

最终,我想通过UI Automation从控件中检索文本,如下所示,但从技术上讲,我认为你必须先编译代码才能将其视为失败。 ;)

var
  UIAuto: IUIAutomation;
  Element: IUIAutomationElement;
  RetVal: HResult;
  APattern: AutomationPattern;    //not defined!
  ValuePattern : ValuePattern;    //not defined!
begin
  UIAuto := CoCUIAutomation.Create;
  Element := UIAuto.GetFocusedElement(RetVal);
  if Assigned(Element) then begin
    if Element.TryGetCurrentPattern(ValuePattern.Pattern, APattern) then begin  //not defined!
      Result := ValuePattern.Current.Value;                                     //not defined!
  ...

end;

2 个答案:

答案 0 :(得分:1)

您正在将.NET类导入为COM对象。在.NET中,类和方法必须显式声明为COMVisible=True才能通过COM访问。在没有看到UIAutomationClient.dll实际导出其AutomationElement class的情况下,我的猜测是它的TryGetCurrentPattern()方法未被声明为COM可见。

另一方面,IUIAutomationElement interface exported from UIAutomationCore.dll没有TryGetCurrentPattern()方法。

答案 1 :(得分:1)

看起来您已导入.net程序集。

从本机代码中,最好导入本机COM类型库。步骤是:

  1. 组件|导入组件。
  2. 导入类型库。
  3. 选择在UIAutomationCore.dll中实现的UIAutomationClient。
  4. 这会导入一个类型库并创建一个名为UIAutomationClient_TLB的单元。

    您需要的方法是IUIAutomationElement.GetCurrentPattern。接口的.net版本中的TryGetCurrentPattern方法只是一种方便的方法,它指示布尔返回值失败而不是引发异常。当您致电IUIAutomationElement.GetCurrentPattern时,您需要检查HRESULT返回值以检测故障。