System.Windows.Forms.WebBrowser ouvre les liens dans la même fenêtre ou dans une nouvelle fenêtre avec la même session

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

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top