常见报错及原因
1、JS脚本错误:由于跨域调用、浏览器内核版本不兼容等原因,导致网页中的JavaScript代码无法正常运行,从而引发脚本错误。
2、页面加载不完全或功能异常:可能是由于控件对Webbrowser COM组件的封装不完全,或者IE内核版本与网页要求不匹配等原因,导致部分页面元素加载不出来,点击按钮无反应等问题。

3、安全警报提示:当网页中的脚本涉及到一些敏感操作或访问受限资源时,可能会触发安全警报,即使设置了ScriptErrorsSuppressed = true,也无法完全避免此类提示。
解决方法
1、禁用脚本错误提示:将WebBrowser控件的ScriptErrorsSuppressed属性设置为true,可以禁用脚本错误的弹出提示,但网页仍可能存在功能异常。
2、设置IE内核版本:通过修改注册表,强制WebBrowser控件使用特定的IE内核版本,以解决因内核版本不兼容导致的页面显示和脚本执行问题,将注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION项下的应用程序名称对应的值设置为所需的IE版本号(如9999表示强制使用IE9内核)。
3、处理文档窗口错误:在DocumentCompleted事件中,为Document.Window.Error事件添加处理方法,并在方法中将e.Handled设置为true,以阻止错误消息的弹出。
示例代码
以下是一个综合应用上述方法的示例代码:
using System;
using System.Windows.Forms;
using SHDocVw;
public class MyForm : Form
{
private WebBrowser webBrowser1;
public MyForm()
{
InitializeComponent();
this.webBrowser1 = new WebBrowser();
this.SuspendLayout();
//
// webBrowser1
//
this.webBrowser1.Dock = DockStyle.Fill;
this.webBrowser1.Location = new System.Drawing.Point(0, 0);
this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
this.webBrowser1.Name = "webBrowser1";
this.webBrowser1.Size = new System.Drawing.Size(284, 261);
this.webBrowser1.TabIndex = 0;
this.webBrowser1.Url = new Uri("http://www.example.com"); // 替换为实际的URL
this.webBrowser1.ScriptErrorsSuppressed = true;
this.webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(this.WebBrowser1_DocumentCompleted);
//
// MyForm
//
this.ClientSize = new System.Drawing.Size(284, 261);
this.Controls.Add(this.webBrowser1);
this.Name = "MyForm";
this.Load += new EventHandler(this.MyForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
private void MyForm_Load(object sender, EventArgs e)
{
SetIEVersion(IeVersion.强制ie9);
}
private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.webBrowser1.Document.Window.Error += new HtmlElementErrorEventHandler(this.OnWebBrowserDocumentWindowError);
}
private void OnWebBrowserDocumentWindowError(object sender, HtmlElementErrorEventArgs e)
{
e.Handled = true;
}
private void SetIEVersion(IeVersion ver)
{
string productName = AppDomain.CurrentDomain.SetupInformation.ApplicationName;
object version;
switch (ver)
{
case IeVersion.标准ie7:
version = 0x1B58;
break;
case IeVersion.标准ie8:
version = 0x1F40;
break;
case IeVersion.强制ie8:
version = 0x22B8;
break;
case IeVersion.标准ie9:
version = 0x2328;
break;
case IeVersion.强制ie9:
version = 0x270F;
break;
case IeVersion.标准ie10:
version = 0x02710;
break;
case IeVersion.强制ie10:
version = 0x2711;
break;
default:
version = 0x1F40;
break;
}
RegistryKey key = Registry.CurrentUser;
RegistryKey software = key.CreateSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\" + productName);
if (software != null)
{
software.Close();
software.Dispose();
}
RegistryKey wwui = key.OpenSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);
if (wwui != null) wwui.SetValue(productName, version, RegistryValueKind.DWord);
}
private enum IeVersion
{
强制ie10,//10001 (0x2711) Internet Explorer 10,网页以IE 10的标准模式展现,页面!DOCTYPE无效
标准ie10,//10000 (0x02710) Internet Explorer 10,在IE 10标准模式中按照网页上!DOCTYPE指令来显示网页,Internet Explorer 10 默认值。
强制ie9,//9999 (0x270F) Windows Internet Explorer 9. 强制IE9显示,忽略!DOCTYPE指令
标准ie9,//9000 (0x2328) Internet Explorer 9. Internet Explorer 9默认值,在IE9标准模式中按照网页上!DOCTYPE指令来显示网页。
强制ie8,//8888 (0x22B8) Internet Explorer 8,强制IE8标准模式显示,忽略!DOCTYPE指令
标准ie8,//8000 (0x1F40) Internet Explorer 8默认设置,在IE8标准模式中按照网页上!DOCTYPE指令展示网页
标准ie7//7000 (0x1B58) 使用WebBrowser Control控件的应用程序所使用的默认值,在IE7标准模式中按照网页上!DOCTYPE指令来展示网页
}
}FAQs
1、为什么设置了ScriptErrorsSuppressed = true,仍然会看到脚本错误提示?

虽然ScriptErrorsSuppressed = true可以禁用脚本错误的弹出提示,但对于一些安全警报或特定类型的错误,可能仍然会显示提示,如果网页中的脚本本身存在逻辑错误或兼容性问题,即使没有错误提示,也可能导致页面功能异常。
解决方法是除了设置ScriptErrorsSuppressed外,还可以尝试通过其他方式优化脚本代码或调整浏览器设置来减少错误发生的可能性,例如设置IE内核版本、处理文档窗口错误等。
2、如何确保WebBrowser控件使用的是正确的IE内核版本?
可以通过修改注册表的方式来强制WebBrowser控件使用特定的IE内核版本,首先获取应用程序的名称,然后在注册表中相应的路径下创建或修改FEATURE_BROWSER_EMULATION项的值,将其设置为所需的IE版本号(如9999表示强制使用IE9内核)。
需要注意的是,修改注册表可能会对系统产生影响,因此在进行修改前最好备份注册表,并确保在正确的环境下进行操作,不同的IE版本对应的值是不同的,需要根据实际情况进行设置。

