如何检测TChromium中的点击?

时间:2014-02-21 04:46:46

标签: 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') then
Form1.Close;

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

end;

然而,副作用是浏览器的URL被更改,这是我不想要的。如何在没有更改URL的情况下检测用户何时单击链接?

1 个答案:

答案 0 :(得分:4)

如果我的问题正确,那么您的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标识符。现在让我们为click元素添加minimize事件的监听器。加载帧后立即执行此绑定,这通过触发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>

当然,您可以根据需要为事件监听器添加多少元素。