Delphi 如何检测TChromium中的点击?

Delphi 如何检测TChromium中的点击?,delphi,delphi-7,chromium-embedded,Delphi,Delphi 7,Chromium Embedded,我在我的Delphi应用程序中有一个TChromium控件,在我显示的页面上,有一个最小化应用程序的链接。目前,我通过检测地址更改来检测用户何时单击该链接: procedure TForm1.Chromium1AddressChange(Sender: TObject;const browser: ICefBrowser; const frame: ICefFrame; const url: ustring); begin if (url = 'file:///data/exiting.exit

我在我的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文档中会有这样一个链接:


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

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


正如您所注意到的,它不会导航到任何地方,但仍将作为链接呈现。它也有自己独特的
id
标识符,用于DOM explore标识。现在,让我们为
minimize
元素的
click
事件添加侦听器。该绑定在加载帧后立即完成,并通过触发事件来报告。在那里,我们将探索DOM树,找到我们的
最小化
元素,并将
单击
事件侦听器附加到它:

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文档进行细微更改,您可以收听您选择的任何事件或元素,因此您可以在您的网站上设置一个按钮:


减少

当然,您可以为任意多的元素附加事件侦听器。

我不明白。您可以随时调用
应用程序。最小化
。你不需要等到有人在地址栏中键入一个神奇的URL。你真正的问题是什么?当有人按下html文档中的最小化按钮时,Application.Minimize调用。最小化按钮-。当我按下此按钮时,我的应用程序将最小化并将url更改为file:///data/minimize.min.I 看见你问如何最小化程序,但那不是你真正想知道的;你已经知道怎么做了。您真正想要的是以一种破坏性较小的方式检测浏览器控件中的单击事件。我已经相应地编辑了你的问题。当然,谢谢!对不起我的英语!OnExploreDOM未执行。我通过DOMNode:=Document.GetElementById('minimize')后的put ShowMessage('OnExploreDOM')检查它;问题很可能出在您使用的DCEF版本中。我记得其中一些(较新的版本)在根本无法探索DOM时有一个bug。这是一个好主意。使用这种技术的唯一解决方案是使用不同的版本(DCEF1的旧版本可以工作,或者现在(已经修复)在基于新平台的平台上)CEF3@TLama是否可以单击ICefDomNode
?我们可以编辑值和属性,但可以单击吗?@TLama:这个答案不适用于dcef3(AddEventListenerProc在dcef3中不再存在)。是否有针对dcef3的解决方案?谢谢