这个基本问题,但我被困了......
我正在尝试在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;
答案 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类型库。步骤是:
这会导入一个类型库并创建一个名为UIAutomationClient_TLB
的单元。
您需要的方法是IUIAutomationElement.GetCurrentPattern
。接口的.net版本中的TryGetCurrentPattern
方法只是一种方便的方法,它指示布尔返回值失败而不是引发异常。当您致电IUIAutomationElement.GetCurrentPattern
时,您需要检查HRESULT
返回值以检测故障。