Come faccio ad aprire i link da un componente TCppWebBrowser nel browser di default del sistema
-
21-09-2019 - |
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.
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