Как открыть ссылки из компонента TCppWebBrowser в системном браузере по умолчанию - PullRequest
1 голос
/ 13 октября 2009

Мы используем компонент TCppWebBrowser в нашей программе как своего рода окно чата, но поскольку TCppwebrowser использует IExplorerengine, все ссылки, по которым щелкают, открываются в IExplorer. У меня есть одна идея - отменить навигацию в Onbeforenavigate2 и выполнить Shell.execute, но в надежде найти более элегантное решение, такое как windowsmessage, которое я мог бы обработать, или событие, или что-то подобное.

Ответы [ 3 ]

7 голосов
/ 13 октября 2009

Предполагая, что TCppWebBrowser похож на TWebBrowser в Delphi, что-то вроде приведенного ниже кода должно помочь вам.

Событие OnBeforeNavigate2 запускается до перехода TWebBrowser к новому URL-адресу. Вы отменяете эту навигацию и перенаправляете URL с ShellExecute во внешнее приложение (которое является веб-браузером по умолчанию, настроенным в Windows).

Чтобы получить приведенный ниже код, дважды щелкните форму, а затем введите содержимое метода события FormCreate. Затем удалите TWebBrowser, перейдите на страницу событий инспектора объектов, дважды щелкните событие 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.Create(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.stackoverflow.com');
  RedirectUrls := True;
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp:
    IDispatch; var URL, 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.
2 голосов
/ 14 октября 2009

Пример, приведенный Jeroen, верен, за исключением того, что это не C ++, и я подумал, что вы можете найти пример на языке, который вы используете, полезным. Компонент TCppWebBrowser аналогичен компоненту TWebBrowser и имеет те же события. (Однако, когда вы пытаетесь получить доступ к некоторым внутренним элементам, все становится сложнее.)

Вот отредактированная версия метода OnBeforeNavigate2, который я использую:

void __fastcall TMyForm::CppWebBrowserBeforeNavigate2(TObject* /*Sender*/,
        LPDISPATCH /*pDisp*/, Variant* URL, Variant* /*Flags*/, Variant* /*TargetFrameName*/,
        Variant* /*PostData*/, Variant* /*Headers*/, VARIANT_BOOL *Cancel)
{
    UnicodeString strURL(URL->operator UnicodeString());
    if (strURL != m_strWebPage && strURL != L"about:blank") { // if navigating somewhere else, ie the user clicked a link
        *Cancel = true;
        if ((int)::ShellExecute(NULL, L"open", strURL.c_str(), NULL, NULL, SW_SHOWNORMAL) <= 32) {
            MyMessageBox(L"There was an error opening the link '" + strURL + L"'.");
        }
    }
}

Отменяет навигацию в веб-браузере, кроме about:blank (вы можете удалить этот бит, если это не разрешенная для вашего контроля страница) и URL-адрес m_strWebPage, который я хочу заблокировать. Вы можете сделать эту проверку более гибкой, позволяя, например, перемещаться в любом месте определенного домена, но открывать ссылки на другой домен в другом окне, например.

Код также написан для C ++ Builder 2009/2010 из-за его использования UnicodeString и строкового префикса L. Вы не говорите, какую версию вы используете, но если вы используете 2007 или ранее, вместо этого приведете к WideString.

Приветствия

David

0 голосов
/ 22 ноября 2010

На самом деле, когда вы не обрабатывали "webNewWindow2" TCppWebBrowser, ссылка в TCppWebBrowser, которую вы открываете, будет использовать браузер системы по умолчанию. Вам ничего не нужно делать.

Дополнительные коды TCppWebBrowser см. По ссылке, которую я нашел: http://codeback.net/tag/tcppwebbrowser

...