gpt4 book ai didi

delphi - 将 UIAutomation Provider 添加到 Delphi 控件(特别是网格)

转载 作者:行者123 更新时间:2023-12-03 14:53:53 29 4
gpt4 key购买 nike

我们的 VCL Delphi 应用程序有许多网格,我们需要开始通过 UIAutomation 与之交互。存在许多问题,尤其是 TStringGrid 没有实现任何 IUIAutomation 模式(IGridProvider 或 ITableProvider,甚至 IValueProvider)。

我试图找出需要添加到 TStringGrid 中的内容,以允许它实现提供程序(位于 .NET 中的 System.Windows.Automation.Provider 命名空间中)。

最佳答案

这是我的步骤...

(实际文件太大,无法全部发布,因此这是要点的精炼)。

另外 - 这仍然存在重大问题,可能是我自己造成的,但这足以让我取得进展。

  1. 获取 UIAutomationCore.idl(我的是 Visual Studio 安装的一部分)。
  2. 运行 midl.exe 以创建类型库。
  3. 从命令行运行 tlibimp.exe(因为 Delphi 似乎不喜欢步骤 3 中创建的 .tlb),并创建 UIAutomationCore_TLB.pas 文件。这最终会成为一个相当大的文件,UIAutomationCore 的所有 COM 部分都是在 pascal 中定义的。
  4. 原始 DLL 中有些方法不是 COM,这些方法也需要定义。我将这些添加到第 3 步生成的文件中 - 尽管它们可能应该在其他地方定义,以防重新生成该文件。

function UiaHostProviderFromHwnd(hwnd: HWND; provider: IRawElementProviderSimple): LRESULT; stdcall; external 'UIAutomationCore.dll' name 'UiaHostProviderFromHwnd';
function UiaReturnRawElementProvider(hwnd: HWND; wParam: WPARAM; lParam: LPARAM; element : IRawElementProviderSimple) : LRESULT; stdcall; external 'UIAutomationCore.dll' name 'UiaReturnRawElementProvider';


<ol start="5">
<li>The component needs to implement the IRawElementProviderSimple interface, as well as any other providers - in the example case I have used ISelectionProvide, in order to illustrate what I did.</li>
</ol>

<pre> // IRawElementProviderSimple
function Get_ProviderOptions(out pRetVal: ProviderOptions): HResult; stdcall;
function GetPatternProvider(patternId: SYSINT; out pRetVal: IUnknown): HResult; stdcall;
function GetPropertyValue(propertyId: SYSINT; out pRetVal: OleVariant): HResult; stdcall;
function Get_HostRawElementProvider(out pRetVal: IRawElementProviderSimple): HResult; stdcall;

// ISelectionProvider
function GetSelection(out pRetVal: PSafeArray): HResult; stdcall;
function Get_CanSelectMultiple(out pRetVal: Integer): HResult; stdcall;
function Get_IsSelectionRequired(out pRetVal: Integer): HResult; stdcall;
</pre>

<p>These are implemented as follows ..</p>

<pre>function TAutomationStringGrid.Get_ProviderOptions(
out pRetVal: ProviderOptions): HResult;
begin
pRetVal:= ProviderOptions_ClientSideProvider;
Result := S_OK;
end;

function TAutomationStringGrid.GetPatternProvider(patternId: SYSINT;
out pRetVal: IInterface): HResult;
begin
pRetval := nil;
if (patternID = UIA_SelectionPatternId) then
begin
result := QueryInterface(ISelectionProvider, pRetVal);
end
else
result := S_OK;
end;

function TAutomationStringGrid.GetPropertyValue(propertyId: SYSINT;
out pRetVal: OleVariant): HResult;
begin
if(propertyId = UIA_ControlTypePropertyId) then
begin
TVarData(pRetVal).VType := varWord;
TVarData(pRetVal).VWord := UIA_DataGridControlTypeId;
end;
result := S_OK;
end;

function TAutomationStringGrid.Get_HostRawElementProvider(
out pRetVal: IRawElementProviderSimple): HResult;
begin
result := UiaHostProviderFromHwnd (self.Handle, pRetVal);
end;

function TAutomationStringGrid.GetSelection(out pRetVal: PSafeArray): HResult;
begin
end;
function TAutomationStringGrid.Get_CanSelectMultiple(
out pRetVal: Integer): HResult;
begin
end;

function TAutomationStringGrid.Get_IsSelectionRequired(
out pRetVal: Integer): HResult;
begin
end;
</pre>

<p>In order to actually get the control, the WM_GETOBJECT message needs to be handled ...</p>

<pre> procedure WMGetObject(var Message: TMessage); message WM_GETOBJECT;
</pre>

<p>This is implemented as follows ..</p>

procedure TAutomationStringGrid.WMGetObject(var Message: TMessage);
begin
if (Message.Msg = WM_GETOBJECT) then
begin
QueryInterface(IID_IRawElementProviderSimple, FRawElementProviderSimple);

message.Result := UiaReturnRawElementProvider(self.Handle, Message.WParam, Message.LParam, FRawElementProviderSimple);
end
else
Message.Result := DefWindowProc(self.Handle, Message.Msg, Message.WParam, Message.LParam);
end;

关于delphi - 将 UIAutomation Provider 添加到 Delphi 控件(特别是网格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841789/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com