C#.WinForm WebBrowser多页签浏览器

博主在进行web页面内容解析工作时,为方便实现页面内容提取,采用C#下的winform和webBrowser技术开发了一个窗体程序。该程序实现了多tab标签页浏览器模式、页面内链接新标签页打开、页内跳转等效果,供有需要者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#.WinForm 多页签浏览器

最近在做web页面内容解析的工作,为了方便需要开发一个窗体程序,用于实现页面内容提取,采用的是C#下的winform和webBrowser技术。
网上查了一堆资料,很烦,大多写的语焉不详,要么就是资料很老了,发布的示例源代码写的跟鬼一样居然还要几十的下载分,一怒之下自己写了一个,实现的效果包括:
(1)多tab标签页的浏览器模式;
(2)页面内链接的新标签页打开;
(3)页内跳转;
供有需要的参考。比较仓促,可能花点精力细节处会处理的更好;大家简单看看吧。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultipleWebBrowser
{
    public partial class Form1 : Form
    {
        const int CLOSE_SIZE = 8;
        //tabPage标签图片
        Bitmap image = new Bitmap(System.Threading.Thread.GetDomain().BaseDirectory+ "delete.gif");

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 公用地址URL
        /// </summary>
        public string CommonUrl = "";

        private void button1_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtUrl.Text.Trim()))
            {
                webRequest();
            }
        }


        /// <summary>
        /// 处理访问网址事件
        /// </summary>
        private void webRequest()
        {
            bool existweb = false;
            WebBrowser webBrowser = new WebBrowser();
            //判断当前tabpage中是否包含webbrowrse控件
            if (tabControl1.TabPages.Count > 0 && tabControl1.TabPages[tabControl1.SelectedIndex] != null)
            {
                foreach (Control controlObject in tabControl1.TabPages[tabControl1.SelectedIndex].Controls)
                {
                    if (controlObject is WebBrowser browser)    //判断是否是WebBrowser控件
                    {
                        existweb = true;
                        webBrowser = browser;
                    }
                }

                if (existweb)
                {
                    webBrowser.Navigate(txtUrl.Text.Trim());
                }
                else
                {
                    string host = GetDomain(txtUrl.Text.Trim());
                    webBrowser.Dock = DockStyle.Fill;
                    webBrowser.ScriptErrorsSuppressed = true;
                    webBrowser.AllowWebBrowserDrop = false;
                    webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
                    webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
                    webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
                    webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
                    webBrowser.Navigate(txtUrl.Text.Trim());
                    webBrowser.Parent = tabPage1;
                    tabPage1.Controls.Add(webBrowser);
                    tabPage1.Text = host;
                    webBrowser.Show();
                }
            }
            else
            {
                TabPage tabPage = new TabPage();
                tabControl1.TabPages.Add(tabPage);

                string host = GetDomain(txtUrl.Text.Trim());
                webBrowser.Dock = DockStyle.Fill;
                webBrowser.ScriptErrorsSuppressed = true;
                webBrowser.AllowWebBrowserDrop = false;
                webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
                webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
                webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
                webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
                webBrowser.Navigate(txtUrl.Text.Trim());
                webBrowser.Parent = tabPage1;
                tabPage.Controls.Add(webBrowser);
                tabPage.Text = host;
                webBrowser.Show();
            }
          
        }





        /// <summary>
        /// 通过网址得到域名
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private string GetDomain(string url)
        {
            string host;
            Uri uri;
            try
            {

                uri = new Uri(url);
                host = uri.Host + " ";
            }
            catch
            {
                return "";
            }

            string[] BeReplacedStrs = new string[] { ".com.cn", ".edu.cn", ".net.cn", ".org.cn", ".co.jp", ".gov.cn", ".co.uk", "ac.cn", ".edu", ".tv", ".info", ".com", ".ac", ".ag", ".am", ".at", ".be", ".biz", ".bz", ".cc", ".cn", ".com", ".de", ".es", ".eu", ".fm", ".gs", ".hk", ".in", ".info", ".io", ".it", ".jp", ".la", ".md", ".ms", ".name", ".net", ".nl", ".nu", ".org", ".pl", ".ru", ".sc", ".se", ".sg", ".sh", ".tc", ".tk", ".tv", ".tw", ".us", ".co", ".uk", ".vc", ".vg", ".ws", ".il", ".li", ".nz" };

            foreach (string oneBeReplacedStr in BeReplacedStrs)
            {
                string BeReplacedStr = oneBeReplacedStr + " ";
                if (host.IndexOf(BeReplacedStr) != -1)
                {
                    host = host.Replace(BeReplacedStr, string.Empty);
                    break;
                }
            }

            int dotIndex = host.LastIndexOf(".");
            host = uri.Host.Substring(dotIndex + 1);
            return host;
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            btnBack.Enabled = false;
            btnForward.Enabled = false;

            //设置关闭按钮
            this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
            this.tabControl1.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);
            this.tabControl1.DrawItem += new DrawItemEventHandler(this.MainTabControlClose_DrawItem);
            this.tabControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControlClose_MouseDown);

        }






        public void webBrowser_NewWindow(object sender, CancelEventArgs e)
        {
            if (((Control)sender) is WebBrowser)
            {
                var webBrowser = (WebBrowser)sender;
                if (!string.IsNullOrWhiteSpace(webBrowser.StatusText))
                {
                    e.Cancel = true;

                    webBrowser.Dock = DockStyle.Fill;
                    webBrowser.ScriptErrorsSuppressed = true;
                    webBrowser.AllowWebBrowserDrop = false;
                    webBrowser.Navigate(webBrowser.StatusText);
                    webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
                    webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
                    webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
                    webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);

                    string title = GetDomain(webBrowser.StatusText);
                    TabPage tabPage = new TabPage(title);
                    webBrowser.Parent = tabPage;
                    tabPage.Controls.Add(webBrowser);
                    tabControl1.TabPages.Add(tabPage);
                    tabPage.Text = title;
                    tabControl1.SelectedTab=tabPage;
                    webBrowser.Show();
                }
            }
        }

        private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if ((Control)sender is WebBrowser)
            {
                var webBrowser = (WebBrowser)sender;
                string title = (string.IsNullOrWhiteSpace(webBrowser.DocumentTitle)) ? webBrowser.Url.Host : webBrowser.DocumentTitle;
                webBrowser.Parent.Text = title;
                txtUrl.Text = webBrowser.Url.ToString();
            }
        }


        private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            if ((Control)sender is WebBrowser)
            {
                var webBrowser = (WebBrowser)sender;
                string title = (string.IsNullOrWhiteSpace(webBrowser.DocumentTitle)) ? webBrowser.Url.Host : webBrowser.DocumentTitle;
                webBrowser.Parent.Text = title;
                btnBack.Enabled = webBrowser.CanGoBack;
                btnForward.Enabled = webBrowser.CanGoForward;
            }
        }

        private void webBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
        {
            if ((Control)sender is WebBrowser)
            {
                var webBrowser = (WebBrowser)sender;
                toolStripLabel1.Text = webBrowser.StatusText;
            }
        }

        private void txtUrl_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter && !string.IsNullOrWhiteSpace(txtUrl.Text.Trim()))
            {
                webRequest();
            }
        }


  
        //关闭按钮功能
        private void MainTabControlClose_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
                {
                    Rectangle r = tabControl1.GetTabRect(i);
                    //Getting the position of the "x" mark.
                    Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
                    if (closeButton.Contains(e.Location))
                    {
                        this.tabControl1.TabPages.RemoveAt(i);
                            break;
                    }
                }
            }
        }
    }
}

public class WebBrowserTag
{
    public int _TabIndex = 0;
    public bool _CanBack = false;
    public bool _CanForward = false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值