2014-09-02 2 views
3

Я хочу достичь этого, когда пользователь нажимает на гиперссылку внутри страницы браузера TChromium, новая страница открывается в браузере по умолчанию.Как сделать клик по ссылке браузера хрома открытым в браузере по умолчанию?

+3

В 'OnBeforeBrowse' проверки событий, если' navType' равен 'NAVTYPE_LINKCLICKED' и если да, то вернуть Верные' параметра Result' (который отменит запрос для Chromium) и назовите, например, 'ShellExecute' передает' request.Url'. – TLama

+2

Это блестяще. Почему вы не опубликовали это как ответ? Вы слишком недостойны? :) – Domus

ответ

4

При проверке OnBeforeBrowse событий, если параметр navType равен NAVTYPE_LINKCLICKED, и если да, возвращающие к параметру Result (который отменит запрос на Chromium) и вызывать, например, 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 добавить "else Результат: = False" ? – Domus

+0

Лучше может быть 'Результат: = False' в начале метода, но это не обязательно, поскольку False является [' initial result'] (https://code.google.com/p/delphichromiumembedded/source/browse/ ствол/SRC/cefvcl.pas # 644). – TLama

+1

Вы, конечно, правы, но параметр nilled out - это скорее подразумеваемая ситуация, с Delphi. :) – Domus

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;