System.Windows.Forms.WebBrowser открывает ссылки в том же окне или новом окне с тем же сеансом

При использовании элемента управления .NET WebBrowser, как вы открываете ссылку в новом окне, используя тот же сеанс (т. е. не запускаете новый сеанс ASP.NET на сервере), или как вы фиксируете событие нового окна для открыть URL-адрес в том же элементе управления WebBrowser?


person Greg Bray    schedule 06.10.2008    source источник


Ответы (3)


Я только что потратил час на поиск ответа, поэтому я решил опубликовать результаты здесь. Вы можете использовать объект SHDocVwCtl.WebBrowser_V1 для захвата события NewWindow.

ПРИМЕЧАНИЕ. Код взят с 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();
}
person Greg Bray    schedule 06.10.2008
comment
В какой сборке определен SHDocVw? Я не могу найти его в mshtml.dll, по крайней мере. - person Asbjørn Ulsberg; 26.03.2010
comment
Я думаю, что он находится в папке %WINDIR%\system32\shdocvw.dll. - person Greg Bray; 28.03.2010
comment
Obejet не является членом webBrower1, вот что я получаю - person ; 15.01.2011
comment
+100 за всю бесполезную чушь, которую мне пришлось прочитать, прежде чем я нашел это. - person Paul Draper; 22.11.2012
comment
Кто-нибудь знает, как (или если) это можно сделать с помощью Powershell? - person robross0606; 15.09.2017

Слегка подчищенная версия ответа Грега. Он изменяет поведение переданного элемента управления, а не полагается на глобальную переменную. Использование:

InlinePopups(webBrowser1);

Код:

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

Еще нужна ссылка на %WINDIR%\system32\shdocvw.dll, конечно.

person jvenema    schedule 06.05.2013

После добавления ссылки на shdocvw.dll в ваш проект, если вы не добавляете объект actucusl в свой набор инструментов (shwos как Microsoft Browser), определите объект в верхней части кода с помощью:

Dim WithEvents Web_V1 As SHDocVw.WebBrowser_V1

person Chris Raisin    schedule 22.07.2020