WebBrowser 内嵌网页浏览器控件

WebBrowser 内嵌网页浏览器控件

WebBrowser 是一个内嵌到 WinForm 软件中的网页浏览器控件,基于本机安装的 IE 内核。通过设置 Url 属性即可加载并展示网页内容。

基本使用

拖拽 WebBrowser 到窗体后,设置 Url 属性或在代码中指定地址:

private void Form1_Load(object sender, EventArgs e)
{
    this.webBrowser1.Url = new Uri("http://www.foxdevelop.com");
}Code language: JavaScript (javascript)

也可以直接导航到指定网址:

private void button1_Click(object sender, EventArgs e)
{
    this.webBrowser1.Navigate("http://www.baidu.com");
}Code language: JavaScript (javascript)

常用属性

属性说明
Url获取或设置当前加载的网页地址
DocumentText获取或设置当前页面的 HTML 内容
DocumentStream获取或设置当前页面的流数据
DocumentTitle获取当前网页的标题
Document获取当前页面的 HTML 文档对象
CanGoBack是否可后退
CanGoForward是否可前进
IsBusy是否正在加载页面
ReadyState当前加载状态
ScriptErrorsSuppressed是否禁止显示脚本错误弹窗
ScrollBarsEnabled是否显示滚动条
AllowWebBrowserDrop是否允许拖放文件到浏览器
WebBrowserShortcutsEnabled是否启用浏览器快捷键
this.webBrowser1.ScriptErrorsSuppressed = true;   // 禁止脚本错误弹窗
this.webBrowser1.ScrollBarsEnabled = true;
this.webBrowser1.AllowWebBrowserDrop = false;
this.webBrowser1.WebBrowserShortcutsEnabled = true;Code language: JavaScript (javascript)

常用方法

方法说明
Navigate(string)导航到指定 URL
Navigate(Uri)导航到指定 Uri
GoBack()后退
GoForward()前进
Refresh()刷新页面
Stop()停止加载
GoHome()回到主页
GoSearch()打开搜索页
ShowPageSetupDialog()显示页面设置对话框
ShowPrintDialog()显示打印对话框
ShowPrintPreviewDialog()显示打印预览对话框
ShowPropertiesDialog()显示属性对话框
ShowSaveAsDialog()显示另存为对话框
DocumentText直接写入 HTML 字符串
// 直接渲染 HTML
this.webBrowser1.DocumentText = "<html><body><h1>Hello World</h1></body></html>";

// 后退/前进
private void buttonBack_Click(object sender, EventArgs e)
{
    if (this.webBrowser1.CanGoBack)
        this.webBrowser1.GoBack();
}

private void buttonForward_Click(object sender, EventArgs e)
{
    if (this.webBrowser1.CanGoForward)
        this.webBrowser1.GoForward();
}

// 刷新
private void buttonRefresh_Click(object sender, EventArgs e)
{
    this.webBrowser1.Refresh();
}Code language: JavaScript (javascript)

常用事件

事件说明
Navigating开始导航前触发(可取消)
Navigated导航完成、页面开始加载时触发
DocumentCompleted页面加载完成后触发
ProgressChanged加载进度改变时触发
DocumentTitleChanged页面标题改变时触发
StatusTextChanged状态栏文本改变时触发
NewWindow尝试打开新窗口时触发(可取消)
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    this.Text = this.webBrowser1.DocumentTitle; // 将窗体标题设为网页标题
}

private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
    if (e.MaximumProgress > 0)
    {
        int percent = (int)(e.CurrentProgress * 100 / e.MaximumProgress);
        this.progressBar1.Value = percent;
    }
}

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    // 可在此处拦截特定网址
    if (e.Url.ToString().Contains("blocked"))
    {
        e.Cancel = true;
        MessageBox.Show("该网址已被拦截");
    }
}Code language: JavaScript (javascript)

C# 与 JavaScript 互操作

C# 调用 JavaScript:

private void buttonCallJs_Click(object sender, EventArgs e)
{
    this.webBrowser1.Document.InvokeScript("alert", new object[] { "Hello from C#" });
}

// 调用页面中的自定义函数
this.webBrowser1.Document.InvokeScript("myFunction", new object[] { "参数1", "参数2" });Code language: JavaScript (javascript)

JavaScript 调用 C#:

// 将 C# 对象暴露给 JavaScript
[ComVisible(true)]
public class ScriptObject
{
    public void ShowMessage(string msg)
    {
        MessageBox.Show("来自JS的消息:" + msg);
    }
}

// 在窗体中注册
private void Form1_Load(object sender, EventArgs e)
{
    this.webBrowser1.ObjectForScripting = new ScriptObject();
    this.webBrowser1.Navigate("http://localhost/test.html");
}Code language: JavaScript (javascript)
<!-- 网页中的 JavaScript -->
<script>
    function callCSharp() {
        window.external.ShowMessage("Hello from JS");
    }
</script>
<button onclick="callCSharp()">调用C#方法</button>Code language: HTML, XML (xml)

注意事项

  • WebBrowser 基于 IE 内核(默认使用 IE7 渲染模式),即使系统安装了更高版本的 IE
  • 如需使用更高版本 IE 渲染,需修改注册表:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
添加:你的程序名.exe = DWORD值
值对应 IE 版本
11001IE11
10001IE10
9000IE9
8000IE8
7000IE7
  • 如果需要在 WinForm 中使用现代浏览器引擎,建议使用 WebView2(基于 Chromium Edge),功能更强大且持续更新
  • ScriptErrorsSuppressed = true 可避免频繁的脚本错误弹窗干扰用户体验

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注