gpt4 book ai didi

delphi - 如何检测 TChromium 中的点击?

转载 作者:行者123 更新时间:2023-12-03 15:12:11 25 4
gpt4 key购买 nike

我的 Delphi 应用程序中有一个 TChromium 控件,在我显示的页面上,有一个最小化应用程序的链接。目前,我通过检测地址更改来检测用户何时单击该链接:

procedure TForm1.Chromium1AddressChange(Sender: TObject;const browser: ICefBrowser; const frame: ICefFrame; const url: ustring);
begin
if (url = 'file:///data/exiting.exit') then
Form1.Close;

if (url = 'file:///data/minimize.min') then
Application.Minimize;

end;

但是,副作用是浏览器的 URL 被更改,这是我不希望的。如何在不更改 URL 的情况下检测用户何时单击链接?

最佳答案

如果我解决了您的问题,您的 HTML 文档中就会有这样的链接:

<a href="minimize.min">Minimize</a>

当单击此链接时,您希望在应用程序中执行某些操作,但您不想导航到该链接,因为它只是一个仅用于识别操作的虚假链接。嗯,OnAddressChange是一个需要处理的错误事件,因为当帧的地址发生更改时,显示处理程序会触发它。因此,现在取消从那里到该假网站的导航为时已晚。在 DCEF 1 中,您可以为 OnBeforeBrowse 编写一个处理程序。 ,但即使这样也不是“如此干净”的解决方案,因为您必须解析框架导航到的 URL。

正确的方法是离开假站点导航并使用 DOM 事件监听器。那么您在交互中使用什么元素或事件并不重要。让我们来看看这个简约的 HTML 文档:

<html>
<body>
<a id="minimize" href="">Minimize</a>
</body>
</html>

正如您所注意到的,它导航到任何地方,但它仍然会呈现为链接。它还具有 DOM 探索识别所需的自己唯一的 id 标识符。现在,我们为 minimize 元素添加 click 事件的监听器。加载框架后,此绑定(bind)就会完成,这是通过触发 OnLoadEnd 来报告的。事件。在那里,我们将探索 DOM 树,找到 minimize 元素并将 click 事件监听器附加到它:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cefvcl, ceflib;

type
TForm1 = class(TForm)
Chromium1: TChromium;
procedure FormCreate(Sender: TObject);
procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Chromium1.Load('C:\File.html');
end;

procedure MinimizeClickEvent(const AEvent: ICefDomEvent);
begin
ShowMessage('Here the application can be minimized.');
end;

procedure OnExploreDOM(const ADocument: ICefDomDocument);
var
DOMNode: ICefDomNode;
begin
// here we attempt to find our "minimize" element
DOMNode := ADocument.GetElementById('minimize');
// and if we find it, we attach to its click event our MinimizeClickEvent
// procedure so whenever the element will be clicked, that procedure will
// execute
if Assigned(DOMNode) then
DOMNode.AddEventListenerProc('click', True, MinimizeClickEvent);
end;

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
begin
if Assigned(frame) then
frame.VisitDomProc(OnExploreDOM);
end;

end.

通过对代码或 HTML 文档进行少量更改,您可以监听您选择的任何事件或元素,这样您就可以拥有例如您网站上的一个按钮:

<html>
<body>
<button id="minimize" type="button">Minimize</button>
</body>
</html>

当然,您可以根据需要为任意数量的元素附加事件监听器。

关于delphi - 如何检测 TChromium 中的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21925494/

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