在新TAB中打开链接(WebBrowser控件)

时间:2009-08-17 08:19:47

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

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

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

非常感谢任何建议/样品。

谢谢。

6 个答案:

答案 0 :(得分:26)

根据您的评论,我了解您希望捕获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的初始选项卡)

关闭选项卡时,不要忘记取消注册事件!

答案 1 :(得分:4)

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

答案 2 :(得分: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); 
        }

答案 3 :(得分:3)

我对此主题进行了一些研究,并且不需要执行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页 - &gt; 5。

答案 4 :(得分:0)

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

这是一个完整的例子。这假设您有一个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;
        }
    }
}

答案 5 :(得分:-2)

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