【问题标题】:Open link in new TAB (WebBrowser Control)在新选项卡中打开链接(WebBrowser 控件)
【发布时间】:2010-11-20 04:20:12
【问题描述】:

有人知道如何在 WinForms 应用程序中单击 WebBrowser 控件中的链接,然后在我的 TabControl 内的新选项卡中打开该链接吗?

我已经搜索了几个月,看过很多教程/文章/代码示例,但似乎之前没有人在 C# 中尝试过。

非常感谢任何建议/示例。

谢谢。

【问题讨论】:

  • 我是其他人,当我在自己的浏览器中单击网页链接时,打开即出现问题。尝试了以上所有方法但没有运气,Robert的第一个回复我在设计模式下添加了ExtendedWebBrowser,但我仍然在最后一行代码(InitialTabBrowser)下面看到红线,并且'InitialTabBroswer的警告不存在在当前情况下”。任何更多的提示/建议都会很棒。

标签: c# .net winforms webbrowser-control tabcontrol


【解决方案1】:

根据您的 cmets,我了解到您希望捕获 WebBrowser 控件的“在新窗口中打开”操作,并改写默认行为以在应用程序内的新选项卡中打开。

要可靠地完成此操作,您需要获取 NewWindow2 事件,该事件公开 ppDisp(指向应打开新窗口的 WebBrowser 控件的可设置指针)。 所有其他潜在的黑客攻击解决方案(例如获取用户在 OpenWindow 事件之前选择的最后一个链接)都不是最佳的,并且在极端情况下必然会失败。

幸运的是,有一种(相对)简单的方法可以完成此操作,同时仍使用 System.Windows.Forms.WebBrowser 控件作为基础。您需要做的就是扩展 WebBrowser 并拦截 NewWindow2 事件,同时提供对 ActiveX 实例的公共访问(用于在新选项卡中传递到 ppDisp)。以前已经这样做过,Mauricio Rojas 有一个很好的例子,有一个完整的工作类“ExtendedWebBrowser”:

http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c-webbrowsercontrol.aspx

一旦您有了 ExtendedWebBrowser 类,您需要做的就是为 NewWindow2 设置处理程序并将 ppDisp 指向新选项卡中的浏览器。这是我整理的一个例子:

    private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser)
    {
        SourceBrowser.NewWindow2 += new EventHandler<NewWindow2EventArgs>(SourceBrowser_NewWindow2);
    }

    void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e)
    {

        TabPage NewTabPage = new TabPage()
        {
            Text = "Loading..."
        };

        ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser()
        {
            Parent = NewTabPage,
            Dock = DockStyle.Fill,
            Tag = NewTabPage
        };

        e.PPDisp = NewTabBrowser.Application;
        InitializeBrowserEvents(NewTabBrowser);

        Tabs.TabPages.Add(NewTabPage);
        Tabs.SelectedTab = NewTabPage;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        InitializeBrowserEvents(InitialTabBrowser);

    }

(假设 TabControl 名为“Tabs”,初始选项卡包含停靠的子控件名为“InitialWebBrowser”的 ExtendedWebBrowser)

标签页关闭时不要忘记取消注册事件!

【讨论】:

  • 非常感谢 Robert 提供示例代码和链接 :-) 我确实有几个问题,我添加了一个类并将其命名为 ExtendedWebBrowser.cs,然后将您的示例代码添加到 Form1 .cs 文件,当我尝试调试时它给了我以下错误:“参数 '1' 无法从 'System.Windows.Forms.WebBrowser 转换为 'ExtendedWebBrowser'。”蓝色波浪线出现在以下代码行下方: InitializeBrowserEvents(InitialTabBrowser);你知道那是什么吗?
  • 确保您的 InitialWebBrowser 类型为“ExtendedWebBrowser” - 看起来您仍在使用“WebBrowser”。要添加 ExtendedWebBrowser,请查看您的工具箱。您应该会在顶部看到它,旁边有一个小齿轮符号。这是您应该在设计模式下为 InitialWebBrowser 控件添加到表单的内容。
  • 由于某些奇怪的原因,我仍然在外部网络浏览器中打开了新窗口,尽管我使用 ExtendedWebBrowser 并使用 NewWindow2 事件来创建新的网络浏览器。
【解决方案2】:
private Uri _MyUrl;    

System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser();
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating);


void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e)
{
    _MyUrl = e.Url;
    e.Cancel;
}

【讨论】:

  • 谢谢 sshow,这非常有帮助,尽管我正在尝试获取发送到新浏览器窗口的 url,以便我可以阻止新浏览器打开并在我自己的浏览器中的新标签?例如,当我右键单击链接并选择在新窗口中打开时,我不希望它在新的 IE 中打开,我希望它在我自己的网络浏览器的新选项卡中打开
  • 也许您可以覆盖“在新窗口中打开”按钮的 ContextMenu。我以前从来没有做过这样的事情。祝你好运!
【解决方案3】:

以下代码有效,只需按照第一个回复创建 ExtendedWebBrowser 类即可。

我正在使用它来打开一个新标签页,但它也可以使用您的浏览器而不是 IE 打开一个新窗口。

希望对你有帮助。

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        InitializeBrowserEvents(browser);
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        browser.IsWebBrowserContextMenuEnabled = true;
public void InitializeBrowserEvents(ExtendedWebBrowser browser)
    {
        browser.NewWindow2 += new EventHandler<ExtendedWebBrowser.NewWindow2EventArgs>(Browser_NewWindow2);
    }

    void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e)
    {

        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        tabControl1.SelectedTab = tabPage;
        browser.Navigate(textBox.Text);

        {
            e.PPDisp = browser.Application;
            InitializeBrowserEvents(browser); 
        }

【讨论】:

    【解决方案4】:

    我对该主题进行了一些研究,不需要执行 ExtendedWebBrowser 类中存在的所有 COM 管道,因为该代码已经存在于生成的 Interop.SHDocVw 中。因此,我能够使用下面更自然的构造来订阅 NewWindow2 事件。在 Visual Studio 中,我必须添加对“Microsoft Internet Controls”的引用。

        using SHDocVw;
        ...
    
        internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...)
        {
            ParameterHelper.ThrowOnNull(webBrowser, "webBrowser");
            ...
    
            (webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2;
        }
    
        private void OnNewWindow2(ref object ppDisp, ref bool Cancel)
        {
            MyTabPage tabPage = TabPageFactory.CreateNewTabPage();
            tabPage.SetBrowserAsContent(out ppDisp);
        }
    

    请阅读http://bit.ly/IDWm5A 了解更多信息。这是该系列中的第 5 页,为了全面了解,我必须返回并阅读第 3 -> 5 页。

    【讨论】:

    • 这是什么?怎么用?
    【解决方案5】:

    您只需取消新窗口事件并自己处理导航和标签内容。

    这是一个完整的示例。这假设您有一个 tabcontrol 和至少 1 个标签页。

    using System.ComponentModel;
    using System.Windows.Forms;
    
    namespace stackoverflow2
    {
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.webBrowser1.NewWindow += WebBrowser1_NewWindow;
                this.webBrowser1.Navigated += Wb_Navigated;
                this.webBrowser1.DocumentText=
                 "<html>"+
                 "<head><title>Title</title></head>"+
                 "<body>"+
                 "<a href = 'http://www.google.com' target = 'abc' > test </a>"+
                 "</body>"+
                 "</html>";
            }
            private void WebBrowser1_NewWindow(object sender, CancelEventArgs e)
            {
                e.Cancel = true; //stop normal new window activity
    
                //get the url you were trying to navigate to
                var url= webBrowser1.Document.ActiveElement.GetAttribute("href");
    
                //set up the tabs
                TabPage tp = new TabPage();
                var wb = new WebBrowser();
                wb.Navigated += Wb_Navigated;
                wb.Size = this.webBrowser1.Size;
                tp.Controls.Add(wb);
                wb.Navigate(url);
                this.tabControl1.Controls.Add(tp);
                tabControl1.SelectedTab = tp;
            }
    
            private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
            {
                tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle;
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      Web 浏览器控件中没有选项卡,因此您需要自己处理选项卡。在 Web 浏览器控件上方添加一个选项卡控件,并在打开新选项卡时创建新的 Web 浏览器控件。当用户打开新窗口并打开新标签时捕获并取消。

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 2017-02-07
        • 2017-07-27
        • 2015-11-28
        相关资源
        最近更新 更多