【问题标题】:Delphi: missing interface declarations for UI Automation methodsDelphi:缺少 UI 自动化方法的接口声明
【发布时间】:2014-09-20 05:19:57
【问题描述】:

这样一个基本的问题,但我被卡住了......

我正在尝试在 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;

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这会导入一个类型库并创建一个名为 UIAutomationClient_TLB 的单元。

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

    【讨论】:

    • 感谢@David 的澄清。我按照您的建议导入了类型库,而不是.Net 程序集。只是没有找到我期望看到的所有方法让我怀疑我拥有“一切”。
    【解决方案2】:

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

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

    【讨论】:

    • 我原以为 UI 自动化接口完全可以通过 COM 访问。那么,这是否让 UI 自动化服务的 Win32 COM 客户端只保留了可用功能的一个子集?如果我需要其中一些接口,我的主要选择是使用 AtoZed Crosstalk 或 Hydra 之类的东西吗?
    • @Mark 你不需要这些。提供的Win32服务很齐全。
    猜你喜欢
    • 2020-08-21
    • 2018-03-30
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多