2009-10-13 7 views
1

Nous utilisons un composant TCppWebBrowser dans notre programme comme une sorte de chatwindow, mais puisque TCppwebrowser utilise le moteur IExplorerengine, tous les liens qui sont cliqués s'ouvrent dans IExplorer. Une idée que j'ai est d'annuler la navigation dans Onbeforenavigate2 et faire un Shell.execute, mais où l'espoir d'une solution plus élégante comme un message Windows que je pourrais gérer ou un événement ou quelque chose.Comment ouvrir des liens à partir d'un composant TCppWebBrowser dans le navigateur par défaut du système

+1

Votre idée est la solution élégante. Vous voulez remplacer l'action par défaut, il y a un rappel pour cela, donc c'est logique de l'utiliser. – MSalters

+1

Qwark, vous dites que vous "espériez ... un événement" que vous pourriez gérer? Que pensez-vous de OnBeforeNavigate2? –

+0

Rob: J'ai édité ma question, donc ça n'a aucun sens, je vois ça maintenant = P – Qwark

Répondre

7

En supposant que TCppWebBrowser soit comme TWebBrowser dans Delphi, quelque chose comme le code ci-dessous devrait vous aider à démarrer.

Le OnBeforeNavigate2 event est déclenché avant que TWebBrowser accède à une nouvelle URL. Ce que vous faites est annuler cette navigation, et redirect the URL with ShellExecute to an external application (qui est le navigateur Web par défaut comme configuré dans Windows).

Pour que le code fonctionne correctement, double-cliquez sur votre formulaire, puis entrez le contenu de la méthode d'événement FormCreate. Ensuite, déposez un TWebBrowser, allez dans la page des événements de l'inspecteur d'objets et double-cliquez sur l'événement OnBeforeNavigate2 et entrez ce code.

Amusez-vous avec!

--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. 
2

L'exemple Jeroen a donné est exact, sauf que ce n'est pas C++, et je pense que vous pouvez trouver un exemple dans la langue que vous utilisez utile. Le composant TCppWebBrowser est similaire au composant TWebBrowser et a les mêmes événements. (Il se complique lorsque vous essayez d'accéder à certains des internes, cependant.)

est ici une version modifiée d'une méthode OnBeforeNavigate2 J'utilise:

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

Il annule la navigation dans le navigateur Web, sauf about:blank (vous pouvez supprimer ce bit si ce n'est pas une page légale pour votre contrôle) et l'URL m_strWebPage est celle que je veux verrouillé. Vous pouvez rendre cette vérification plus flexible, en permettant, par exemple, de naviguer n'importe où sur un domaine donné mais en ouvrant des liens vers un autre domaine dans une autre fenêtre, par exemple.

Le code est également écrit pour C++ Builder 2009/2010, en raison de son utilisation de UnicodeString et du préfixe de chaîne L. Vous ne dites pas quelle version vous utilisez, mais si vous utilisez 2007 ou avant cast à WideString à la place.

Cheers,

David

+0

Merci!Mon C++ est un peu rouillé, d'où l'exemple Delphi que j'ai donné :-) –

+0

Merci. Je programme en C + + Builder, mais je n'ai aucun problème à lire Delphi alors mr Pluimers solution est sympa. Et est une sorte de ce que j'ai fait. – Qwark

0

En fait, lorsque vous ne géraient pas le « webNewWindow2 » du TCppWebBrowser, le lien dans la TCppWebBrowser vous ouvrez sera utilisé le navigateur par défaut du système. Il n'y a rien que vous devez faire.

Pour plus de codes TCppWebBrowser, voir ce lien que j'ai trouvé: http://codeback.net/tag/tcppwebbrowser

Questions connexes