System.Windows.Forms.WebBrowser如何在同一窗口或新窗口中打开链接并保持相同会话

12

当使用.NET WebBrowser控件时,如何在同一会话中打开一个链接,而不是在服务器上启动新的ASP.NET会话?或者如何捕获新窗口事件以在同一WebBrowser控件中打开URL?

3个回答

19

我花了一个小时找答案,所以我想在这里发布结果。你可以使用 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();
}

SHDocVw在哪个程序集中定义的?至少我在mshtml.dll中找不到它。 - Asbjørn Ulsberg
4
我认为它位于%WINDIR%\system32\shdocvw.dll。 - Greg Bray
对象不是webBrower1的成员,这就是我得到的。 - user306142
3
在我找到这篇文章之前,我不得不阅读很多毫无价值的垃圾内容。+100(可能是指点赞或奖励的意思)。 - Paul Draper
有人知道如何(或是否可以)通过Powershell完成这个任务吗? - robross0606

3

这是 Greg 回答的简化版。它修改传入控件的行为,而不是依赖全局变量。用法:

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。

1
在将shdocvw.dll引用添加到您的项目后,如果您没有将实际对象添加到工具箱中(显示为“Microsoft Browser”),则请在代码顶部定义对象:
Dim WithEvents Web_V1 As SHDocVw.WebBrowser_V1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接