2014-09-02 174 views
3

我想要实现,当用户点击TChromium浏览器页面内的超链接时,新页面将在其默认浏览器中打开。如何在默认浏览器中打开铬浏览器链接的点击?

+3

在'OnBeforeBrowse'事件检查,如果'navType'等于'NAVTYPE_LINKCLICKED'如果是的话,返回True到'Result'参数(这将取消对Chromium的请求)并调用例如'ShellExecute'传递'request.Url'。 – TLama 2014-09-02 15:28:16

+2

太棒了。你为什么不发布这个答案?太不适合你了? :) – Domus 2014-09-02 15:56:06

回答

4

在如果navType参数等于NAVTYPE_LINKCLICKED并且如果是这样的OnBeforeBrowse事件检查,返回True到Result参数(这将取消对铬的请求),并调用例如ShellExecute传递request.Url值在用户的默认浏览器中打开链接:

uses 
    ShellAPI, ceflib; 

procedure TForm1.Chromium1BeforeBrowse(Sender: TObject; 
    const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; 
    navType: TCefHandlerNavtype; isRedirect: boolean; out Result: Boolean); 
begin 
    if navType = NAVTYPE_LINKCLICKED then 
    begin 
    Result := True; 
    ShellExecuteW(0, nil, PWideChar(request.Url), nil, nil, SW_SHOWNORMAL); 
    end; 
end; 
+0

mabybe add an “else Result:= False” ? – Domus 2014-09-03 11:40:15

+0

在该方法开始时可能会出现'Result:= False',但不需要,因为False是['initial result'](https://code.google.com/p/delphichromiumembedded/source/browse/)躯干/ SRC/cefvcl.pas#644)。 – TLama 2014-09-03 11:51:30

+1

你当然是对的,但是Delphi的一个缺乏参数更多的暗示情况。 :) – Domus 2014-09-03 12:05:54

2

在CEF3,navType = NAVTYPE_LINKCLICKED不再可能在OnBeforeBrowse事件,如TLama的答案。相反,我发现了如何检测到这种使用TransitionType财产...

procedure TfrmEditor.BrowserBeforeBrowse(Sender: TObject; 
    const browser: ICefBrowser; const frame: ICefFrame; 
    const request: ICefRequest; isRedirect: Boolean; out Result: Boolean); 
begin 
    case Request.TransitionType of 
    TT_LINK: begin 
     // User clicked on link, launch URL... 
     ShellExecuteW(0, nil, PWideChar(Request.Url), nil, nil, SW_SHOWNORMAL); 
     Result:= True; 
    end; 
    TT_EXPLICIT: begin 
     // Source is some other "explicit" navigation action such as creating a new 
     // browser or using the LoadURL function. This is also the default value 
     // for navigations where the actual type is unknown. Do nothing. 
    end; 
    end; 
end; 
相关问题