System.Windows.Forms.WebBrowser apre i collegamenti nella stessa finestra o nuova finestra con la stessa sessione

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

Domanda

Quando si utilizza il controllo .NET WebBrowser come si apre un collegamento in una nuova finestra utilizzando la stessa sessione (ovvero ... non si avvia una nuova sessione ASP.NET sul server) o come si acquisisce il nuovo evento finestra per aprire l'URL nello stesso controllo WebBrowser?

È stato utile?

Soluzione

Ho appena trascorso un'ora a cercare la risposta, quindi ho pensato di pubblicare i risultati qui. È possibile utilizzare l'oggetto SHDocVwCtl.WebBrowser_V1 per acquisire l'evento NewWindow.

NOTA: codice da 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();
}

Altri suggerimenti

Versione leggermente ripulita della risposta di Greg. Modifica il comportamento del controllo passato anziché fare affidamento su una variabile globale. Uso:

InlinePopups(webBrowser1);

Codice:

// 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);
    });
}

Ovviamente necessita ancora del riferimento a% WINDIR% \ system32 \ shdocvw.dll.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top