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
Répondre
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.
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
Merci!Mon C++ est un peu rouillé, d'où l'exemple Delphi que j'ai donné :-) –
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
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
- 1. webbrowser iframes ouvert dans le navigateur par défaut
- 2. Ouverture du navigateur Web par défaut
- 3. Intercepter les liens du navigateur pour ouvrir mon application Android
- 4. Comment modifier le navigateur par défaut dans Expression Blend
- 5. Ouvrir une page html sur un CD d'installation avec le navigateur par défaut
- 6. Comment démarrer l'application dans le système Android directement à partir du navigateur?
- 7. Comment ouvrir une nouvelle fenêtre du navigateur
- 8. Ouvrir le pdf dans le plugin du navigateur
- 9. Redirection vers un lien à l'aide du navigateur par défaut dans l'application Windows Form
- 10. Comment changer le navigateur Web par défaut de Visual Studio?
- 11. Comment les listes de liens SharePoint peuvent-elles s'ouvrir par défaut dans une nouvelle fenêtre?
- 12. Valeur sélectionnée par défaut dans le composant WebPart connecté
- 13. Comment ouvrir un fichier avec le programme associé par défaut
- 14. Intégration de PDF à partir du serveur dans le navigateur
- 15. Ouvrir une page dans la même fenêtre de navigateur à partir de l'application winforms
- 16. Comment ouvrir un fichier externe à partir du code HTML
- 17. Comment désactiver la gestion des boutons JDialog par défaut de la touche ENTRÉE dans un composant
- 18. Menu contextuel dans Outlook 2007 pour les liens à ouvrir dans mon choix de navigateurs
- 19. Énumération des onglets du navigateur à partir d'une application externe
- 20. Comment puis-je ouvrir des liens dans Visual Studio dans mon navigateur Web et non dans Visual Studio?
- 21. détecter les paramètres de proxy du navigateur Web par défaut
- 22. Accès par programme à l'historique du navigateur
- 23. Ouvrir la fenêtre Navigateur du programme Java
- 24. détecter la version exacte du système d'exploitation à partir du navigateur
- 25. Comment appeler le code système à partir de JScript/VBScript?
- 26. Comment ouvrir les données au format PDF du navigateur?
- 27. Comment lancer le lecteur multimédia par défaut à partir d'une application .NET?
- 28. Quel est le moyen sûr d'ouvrir les URL dans le navigateur par défaut?
- 29. Ouvrir une fenêtre modale à la fermeture du navigateur?
- 30. Impression SVG à partir du navigateur
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
Qwark, vous dites que vous "espériez ... un événement" que vous pourriez gérer? Que pensez-vous de OnBeforeNavigate2? –
Rob: J'ai édité ma question, donc ça n'a aucun sens, je vois ça maintenant = P – Qwark