1

这么基本的问题,但我被卡住了......

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

UIAutomationClientMajorVersion = 1;
UIAutomationClientMinorVersion = 0;

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

var
  UIAuto: IUIAutomation;
  Element: IUIAutomationElement;

但是 IUIAutomationElement 的方法似乎丢失了。例如,声明方法的接口中没有任何内容:

    IUIAutomationElement.TryGetCurrentPattern()

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

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

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

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;
4

2 回答 2

1

您正在将 .NET 类作为 COM 对象导入。在 .NET 中,类和方法必须显式声明为COMVisible=True可通过 COM 访问。如果没有看到它的classUIAutomationClient.dll是如何实际导出的,我的猜测是它的方法没有被声明为 COM 可见的。AutomationElementTryGetCurrentPattern()

IUIAutomationElement另一方面,从 导出UIAutomationCore.dll的接口没有TryGetCurrentPattern()方法。

于 2014-07-28T22:35:40.187 回答
1

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

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

  1. 组件 | 导入组件。
  2. 导入类型库。
  3. 选择在 UIAutomationCore.dll 中实现的 UIAutomationClient。

这会导入一个类型库并创建一个名为UIAutomationClient_TLB.

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

于 2014-07-29T09:38:32.317 回答