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

jay*_*t55 12 .net c# tabcontrol webbrowser-control winforms

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

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

任何建议/样品都非常感谢.

谢谢.

Rob*_*les 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);

    }
Run Code Online (Sandbox Code Playgroud)

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

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