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