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

标签 c# .net winforms webbrowser-control tabcontrol

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

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

非常感谢任何建议/ sample 。

谢谢。

最佳答案

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

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

幸运的是,有一种(相对)简单的方法可以完成此操作,同时仍然使用 System.Windows.Forms.WebBrowser 控件作为基础。您需要做的就是扩展 WebBrowser 并拦截 NewWindow2 事件,同时提供对 ActiveX 实例的公共(public)访问(用于在新选项卡中传递到 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 的子控件)

不要忘记在标签页关闭时注销事件!

关于c# - 在新 TAB 中打开链接(WebBrowser 控件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286746/

相关文章:

c# - 在 Windows 8 中序列化 XML 数据(增量存储)

c# - 未使用 EF 代码优先方法映射表

c# - 在 Entity Framework 代码优先方法中映射字典

.net - WCF配置文件: why do we need clientBaseAddress in Binding section?

c# - 制作 GAC 程序集来加载自定义程序集

c# - Windows 窗体 MSN Messenger 登录

C# 隐藏和取消隐藏评论

c# - 简化相对 URL

c# - 如何计算 textchanged 事件的值?

c# - 如何使用 c# Winforms 执行字符串和整数?