C# 使用 WebBrowser 编写一个简易的网页客户端

用C#完成一个简易图形界面的基于 HTTP 协议的浏览器客户端软件。

编译环境:Windows 10
编写工具:Visual Studio 2019
编写语言:C#

一、创建项目

  • 打开 VS2019,点击 “ 创建新项目 ”。

在这里插入图片描述

  • 选择 C# 的 “ Windows 窗体应用 ”,然后点击 “ 下一步 ”。

在这里插入图片描述

  • 输入项目名称,选择保存路径,然后点击 “ 创建 ”。

在这里插入图片描述

  • 创建完毕如下图:

在这里插入图片描述

二、窗体设计

  • 添加 MenuStrip 控件到窗口中,作为菜单栏,并添加如下的下拉选项。

在这里插入图片描述

  • 有一点需要注意,记得更改控件 ID ,不能含中文。

在这里插入图片描述

  • 添加 ToolStrip 控件到窗口中,作为工具栏,如图所示:

在这里插入图片描述

  • 然后添加一些工具项。

在这里插入图片描述

  • 添加 StatusStrip 控件到窗口中,作为状态栏。

在这里插入图片描述

  • 添加一个 StatusLabel(文本内容:当前状态)。

在这里插入图片描述

  • 添加 WebBrowser 控件到窗口中,作为网页的显示界面。

在这里插入图片描述

  • 大致的界面就设计完成,如果还需要细微调整的,可以自行调整。

三、代码编写

说明:
一、按钮类的控件,可以双击后转到代码编辑区;
二、如果出现部分红色波浪线的部分,可以点击 “ 显示修补程序 ” ,这是由于没有定义。

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebShow
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Form1(string url)
        {
            InitializeComponent();

            // 打开用户主页.
            // 以下事件在设计器中不可见.
            webBrowser1.CanGoBackChanged +=
                new EventHandler(webBrowser1_CanGoBackChanged);
            webBrowser1.CanGoForwardChanged +=
                new EventHandler(webBrowser1_CanGoForwardChanged);
            webBrowser1.DocumentTitleChanged +=
                new EventHandler(webBrowser1_DocumentTitleChanged);
            webBrowser1.StatusTextChanged +=
                new EventHandler(webBrowser1_StatusTextChanged);

            if (url == string.Empty)
                webBrowser1.GoHome();
            else
                webBrowser1.Navigate(url);
        }

        //打开本地 html 文件
        private void ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();//实例打开文件窗口对象
            ofd.Filter = "Htm文件(*.htm)|*.htm|Html文件(*.html)|*.html"; //设置“另存为文件类型”或“文件类型”框中出现的选择内容
            ofd.FilterIndex = 1; //设置默认显示文件类型为Jpg文件(*.jpg)|*.jpg
            ofd.Title = "选择Html文件"; //获取或设置文件对话框标题
            ofd.InitialDirectory = Application.StartupPath;
            ofd.RestoreDirectory = true;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                toolStripTextBox1.Text = ofd.FileName;
            }
            else
            {
                return;
            }
        }

        //菜单栏——打印
        private void ToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            webBrowser1.ShowPrintDialog();
        }

        //打印设置
        private void ToolStripMenuItem3_Click(object sender, EventArgs e)
        {
            webBrowser1.ShowPageSetupDialog();
        }

        //打印预览
        private void ToolStripMenuItem4_Click(object sender, EventArgs e)
        {
            webBrowser1.ShowPrintPreviewDialog();
        }

        //网页属性
        private void ToolStripMenuItem5_Click(object sender, EventArgs e)
        {
            webBrowser1.ShowPropertiesDialog();
        }

        //网页源码
        private void ToolStripMenuItem6_Click(object sender, EventArgs e)
        {
            // 显示网页源码的对话框显示出来
            CodeView dialogCodeView = new CodeView();
            dialogCodeView.Text = webBrowser1.Url.ToString() + " - 原始源";
            dialogCodeView.Show();

            // 把网页源码显示在弹出的窗口中
            // 首先解码
            //StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.GetEncoding("GB2312"));
            //StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.UTF8);
            StreamReader reader = new StreamReader(webBrowser1.DocumentStream, Encoding.Default);
            dialogCodeView.sourceCode = reader.ReadToEnd();
            reader.Close();
        }

        //另存为
        private void ToolStripMenuItem7_Click(object sender, EventArgs e)
        {
            webBrowser1.ShowSaveAsDialog();
        }

        //退出
        private void ToolStripMenuItem8_Click(object sender, EventArgs e)
        {
            webBrowser1.Dispose();
            Application.Exit();
        }

        //后退
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            webBrowser1.GoBack();
        }

        //前进
        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            webBrowser1.GoForward();
        }

        //主页
        private void toolStripButton3_Click(object sender, EventArgs e)
        {
            webBrowser1.GoHome();
        }

        //刷新
        private void toolStripButton4_Click(object sender, EventArgs e)
        {
            // 如果地址为 "about:blank" , 避免刷新.
            if (!webBrowser1.Url.Equals("about:blank"))
                webBrowser1.Refresh();
        }

        //前往
        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            Navigate(toolStripTextBox1.Text);
        }

        //停止
        private void toolStripButton6_Click(object sender, EventArgs e)
        {
            webBrowser1.Stop();
        }

        //搜索
        private void toolStripButton7_Click(object sender, EventArgs e)
        {
            webBrowser1.GoSearch();
        }

        //工具栏——打印
        private void toolStripButton8_Click(object sender, EventArgs e)
        {
            webBrowser1.Print();
        }

        //文本框
        private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
            toolStripTextBox1.SelectAll();
        }
        //文本框
        private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Navigate(toolStripTextBox1.Text);
            }
        }

        private void Navigate(String address)
        {
            if (String.IsNullOrEmpty(address)) return;
            if (address.Equals("about:blank")) return;
            try
            {
                webBrowser1.Navigate(new Uri(address));
            }
            catch (System.UriFormatException)
            {
                return;
            }
        }

        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            toolStripTextBox1.Text = webBrowser1.Url.ToString();
        }

        private void webBrowser1_CanGoBackChanged(object sender, EventArgs e)
        {
            toolStripButton1.Enabled = webBrowser1.CanGoBack;
        }

        private void webBrowser1_CanGoForwardChanged(object sender, EventArgs e)
        {
            toolStripButton2.Enabled = webBrowser1.CanGoForward;
        }

        // 用当前网页文档的标题取代窗口标题.
        private void webBrowser1_DocumentTitleChanged(object sender, EventArgs e)
        {
            this.Text = webBrowser1.DocumentTitle;
        }

        private void webBrowser1_StatusTextChanged(object sender, EventArgs e)
        {
            toolStripStatusLabel1.Text = webBrowser1.StatusText;
        }

        // 单击程序中某个链接后会打开新窗口,此时就会执行NewWinow事件中的代码
        // 通过此事件中的代码将打开新窗口中内容添加到本软件的webBrowser控件中显示
        // 实现网页用我们自定义的浏览器显示
        private void webBrowser1_NewWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
            string newURL = webBrowser1.StatusText;
            Form1 newform = new Form1(newURL);
            newform.toolStripStatusLabel1.Text = "正在打开网页 " + newURL + " ...";
            newform.Show();
            // 使其他浏览器无法捕获此事件
            // 阻止了其他浏览器显示网页,而是采用我们自定义的浏览器来显示
            e.Cancel = true;
        }
    }
}

编译结果:

说明:以下页面是点击了 “ 主页 ” 之后显示的。

在这里插入图片描述

四、总结

目前我对 webBrowser 控件的使用还不太熟悉,还是多百度百度才能掌握,在网页显示方面,webBrowser 控件给程序员带来了极大的便利。
另外,我将编写好的源代码上传到网盘,有需要的可以自行下载:
链接:https://pan.baidu.com/s/1eHEqSc_oA-kxTL2SjGmHig
提取码:ofvg

五、参考资料

C# WebBrowser简易浏览器Demo