Come faccio ad aprire i link da un componente TCppWebBrowser nel browser di default del sistema

StackOverflow https://stackoverflow.com/questions/1558768

Domanda

Stiamo usando un componente TCppWebBrowser nel nostro programma come una sorta di finestra di chat, ma dal momento che il TCppwebrowser stanno utilizzando l'IExplorerengine tutti i link che vengono cliccato sta aprendo in IExplorer. Un'idea che ho è di annullare la navigazione in Onbeforenavigate2 un fare uno Shell.execute, ma dove sperando in una soluzione più elegante come un windowsmessage ho potuto gestire o di un evento o qualcosa del genere.

È stato utile?

Soluzione

Supponendo che TCppWebBrowser è come TWebBrowser a Delfi, qualcosa come il codice qui sotto dovrebbe farti andare.

Il evento OnBeforeNavigate2 viene licenziato prima della TWebBrowser naviga ad un nuovo URL. Quello che fate è annullare che la navigazione, e reindirizzare l'URL con ShellExecute per un'applicazione esterna (che è il browser web predefinito come configurato in Windows).

Al fine di ottenere il codice qui sotto a lavorare, fare doppio clic sul modulo, quindi inserire il contenuto metodo di evento FormCreate. Poi cadere un TWebBrowser, andare a fare la pagina degli eventi della finestra di ispezione oggetto e fare doppio clic sull'evento OnBeforeNavigate2 e inserire il codice.

Buon divertimento con essa!

- Jeroen

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.

Altri suggerimenti

L'esempio Jeroen ha dato ragione, tranne che non è C ++, e ho pensato che si potrebbe trovare un esempio nella lingua che si sta utilizzando utile. La componente TCppWebBrowser è simile al componente TWebBrowser e ha gli stessi eventi. (E si complicano quando si tenta di accedere ad alcune delle parti interne, però.)

Ecco una versione modificata di un metodo OnBeforeNavigate2 uso:

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"'.");
        }
    }
}

Si annulla la navigazione all'interno del browser web, se non per about:blank (è possibile rimuovere quel po 'se non è una pagina legale per il controllo) e la m_strWebPage URL che è quello che voglio è bloccato. Si potrebbe fare questo controllo più flessibile, permettendo così, per esempio, navigare ovunque su un determinato dominio, ma l'apertura di collegamenti a un altro dominio in un'altra finestra, per esempio.

Il codice è scritto anche per C ++ Builder 2009/2010, a causa del suo uso di UnicodeString e il prefisso della stringa L. Tu non dici quale versione si sta utilizzando, ma se si utilizza 2007 o prima cast WideString invece.

Saluti,

David

In realtà, quando non gestire il "webNewWindow2" del TCppWebBrowser, il collegamento nel TCppWebBrowser si apre sarà utilizzato il browser predefinito del sistema. Non c'è niente che devi fare.

Per ulteriori codici di TCppWebBrowser, si veda questo link che ho trovato: http://codeback.net/tag/tcppwebbrowser

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top