Разработчики, использующие компоненты TCppWebBrowser в своих программах на Delphi, могут столкнуться с проблемой, когда все клики по ссылкам внутри компонента открываются в браузере Internet Explorer, несмотря на использование других браузеров по умолчанию в операционной системе. Это может быть неудобно, если ваше приложение использует TCppWebBrowser в качестве чатового окна или другого интерфейса, где пользователю необходимо открыть ссылки в стандартном браузере.
Проблема и возможное решение
При использовании TCppWebBrowser в вашей программе, которая работает как чат-окно, по умолчанию все ссылки открываются в Internet Explorer, так как компонент использует движок Internet Explorer. Один из предложенных способов решения проблемы — отмена навигации в событии OnBeforeNavigate2 и выполнение команды Shell.Execute, однако существует более элегантное решение, такое как обработка сообщения Windows или использования события.
Подтвержденное решение
Для решения данной проблемы можно использовать событие OnBeforeNavigate2, которое срабатывает перед навигацией TWebBrowser к новому URL. В этом событии можно отменить навигацию и перенаправить URL, используя ShellExecute, для открытия во внешнем приложении, которое по умолчанию используется в Windows для открытия веб-страниц.
Пример кода на Object Pascal (Delphi) для обработки события OnBeforeNavigate2:
unit MainFormUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OLEVariant; var Cancel: WordBool);
private
RedirectUrls: Boolean;
end;
var
Form1: TForm1;
implementation
uses
ShellAPI;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.stackoverflow.com');
RedirectUrls := True;
end;
procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL,
var Flags, TargetFrameName, PostData, Headers: OLEVariant; var Cancel: WordBool);
var
UrlString: string;
begin
if not RedirectUrls then
Exit;
UrlString := URL;
ShellExecute(Self.WindowHandle, 'open', PChar(UrlString), nil, nil, SW_SHOWNORMAL);
Cancel := True;
end;
end.
В этом примере кода, при клике по ссылке в WebBrowser1, навигация будет отменена, и ссылка откроется в браузере по умолчанию, используемом в операционной системе пользователя.
Альтернативные подходы
Существуют и другие подходы, например, можно не обрабатывать событие webNewWindow2 в TCppWebBrowser, тогда ссылки, открытые в TCppWebBrowser, будут автоматически использовать браузер по умолчанию без дополнительных действий.
Заключение
Использование события OnBeforeNavigate2 позволяет перехватить навигацию по ссылкам в TCppWebBrowser и открыть их во внешнем браузере по умолчанию, что может быть полезно для улучшения пользовательского опыта в вашем приложении.
Разработчикам, использующим `TCppWebBrowser` в Delphi, необходимо перехватить навигацию по ссылкам для их открытия во внешнем браузере по умолчанию, так как по умолчанию `TCppWebBrowser` использует Internet Explorer.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.