Открытие ссылок в TChromium через системный браузер: решение проблемы
Введение
При работе с компонентом TChromium для отображения веб-страниц в приложениях на языке Pascal может возникнуть задача открытия ссылок не внутри эмулируемого браузера, а в системном браузере пользователя. Это позволяет улучшить пользовательский опыт за счет использования всех возможностей и настроек, которые есть у стандартного браузера.
Описание проблемы
Пользователь хочет, чтобы при клике на гиперссылку внутри страницы TChromium, новая страница открывалась в системном браузере пользователя, а не в эмулируемом окне TChromium.
Решение проблемы
Основное решение
Для решения данной задачи можно использовать обработчик событий OnBeforeBrowse компонента TChromium. В этом событии необходимо проверить, что тип навигации (navType) равен NAVTYPE_LINKCLICKED, и если это так, отменить запрос для Chromium, вернув значение True в параметр Result, а затем выполнить открытие ссылки с помощью функции ShellExecute, передав ей URL запроса.
Вот пример кода на Object Pascal (Delphi), который реализует описанный подход:
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;
Дополнительные соображения
В коде выше нет необходимости явно устанавливать параметр Result в False, так как это значение по умолчанию для данного метода.
Альтернативное решение для CEF3
Если используется версия CEF3, то свойство navType = NAVTYPE_LINKCLICKED недоступно в событии OnBeforeBrowse. Вместо этого можно использовать свойство 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
// Пользователь кликнул на ссылку, запустить URL в системном браузере...
ShellExecuteW(0, nil, PWideChar(Request.Url), nil, nil, SW_SHOWNORMAL);
Result:= True;
end;
TT_EXPLICIT: begin
// Источник является другим явным действием навигации, например создание нового
// браузера или использование функции LoadURL. Это также значение по умолчанию для
// навигаций, где фактический тип неизвестен. Ничего не делать.
end;
end;
end;
Заключение
Используя описанные методы, разработчики могут легко интегрировать функциональность открытия ссылок в системном браузере пользователя, что значительно повышает удобство использования приложений на базе TChromium.
Решение проблемы открытия ссылок в TChromium через системный браузер связано с модификацией обработчика событий для перенаправления навигации на внешний браузер.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.