【问题标题】:System.Windows.Forms.WebBrowser open links in same window or new window with same sessionSystem.Windows.Forms.WebBrowser 在同一窗口或具有同一会话的新窗口中打开链接
【发布时间】:2010-09-15 14:32:51
【问题描述】:

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

【问题讨论】:

    标签: .net session popup browser new-window


    【解决方案1】:

    我只花了一个小时寻找答案,所以我想在这里发布结果。您可以使用 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 中找不到。
    • 我认为它位于 %WINDIR%\system32\shdocvw.dll
    • Obejet 不是 webBrower1 的成员,这就是我所知道的
    • +100 我在找到这个之前必须通读的所有毫无价值的废话。
    • 有人知道如何(或是否)可以通过 Powershell 完成此操作吗?
    【解决方案2】:

    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 的引用。

    【讨论】:

      【解决方案3】:

      将 shdocvw.dll 的引用添加到您的项目后 如果您没有将actuasl 对象添加到您的工具箱(shwos 作为“Microsoft 浏览器”) 然后在代码顶部定义对象:

      Dim WithEvents Web_V1 As SHDocVw.WebBrowser_V1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2015-01-16
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多