System.Windows.Forms.WebBrowser ouvre les liens dans la même fenêtre ou dans une nouvelle fenêtre avec la même session
-
05-07-2019 - |
Question
Lors de l'utilisation du contrôle .NET WebBrowser, comment ouvrir un lien dans une nouvelle fenêtre à l'aide de la même session (c'est-à-dire ne pas démarrer une nouvelle session ASP.NET sur le serveur), ou comment capturer la nouvelle session événement de fenêtre pour ouvrir l'URL dans le même contrôle WebBrowser?
La solution
Je viens de passer une heure à chercher la réponse, alors j’ai pensé publier les résultats ici. Vous pouvez utiliser l'objet SHDocVwCtl.WebBrowser_V1 pour capturer l'événement NewWindow.
REMARQUE: code provenant de http: //www.experts- exchange.com/Programming/Languages/Visual_Basic/Q_21484555.html#discussion
//-------------------------------VB.NET Version:-------------------------------
Dim WithEvents Web_V1 As SHDocVwCtl.WebBrowser_V1
Private Sub Form_Load()
Set Web_V1 = WebBrowser1.Object
End Sub
Private Sub Web_V1_NewWindow(ByVal URL As String, ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant, ByVal Headers As String, Processed As Boolean)
Processed = True
WebBrowser1.Navigate URL
End Sub
//-------------------------------C# Version-------------------------------
private SHDocVw.WebBrowser_V1 Web_V1; //Interface to expose ActiveX methods
private void Form1_Load(object sender, EventArgs e)
{
//Setup Web_V1 interface and register event handler
Web_V1 = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(Web_V1_NewWindow);
}
private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData,string Headers, ref bool Processed)
{
Processed = true; //Stop event from being processed
//Code to open in same window
this.webBrowser1.Navigate(URL);
//Code to open in new window instead of same window
//Form1 Popup = new Form1();
//Popup.webBrowser1.Navigate(URL);
//Popup.Show();
}
Autres conseils
Version légèrement nettoyée de la réponse de Greg. Il modifie le comportement du contrôle transmis plutôt que de s'appuyer sur une variable globale. Utilisation:
InlinePopups(webBrowser1);
Code:
// interface to expose ActiveX methods
private SHDocVw.WebBrowser_V1 Web_V1;
private void InlinePopups(WebBrowser browser)
{
// hooks to force new windows to open in the current instance
Web_V1 = (SHDocVw.WebBrowser_V1)browser.ActiveXInstance;
Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler((string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed) =>
{
Processed = true; // stop event from being processed
// open in the existing window
browser.Navigate(URL);
});
}
a toujours besoin de la référence à% WINDIR% \ system32 \ shdocvw.dll, bien sûr.