前言
.NET 版本更新了一代又一代,winform中的webbrowser控件的IE內核版本卻始終用的IE7,好多網站都對IE7已經不支持。webbrowser這個控件就顯得有些雞肋,經過查找大佬門的代碼和資料,終於找到了解決辦法。這里做個記錄。
代碼實現
通用設置類:
using Microsoft.Win32;
using System;
using System.ComponentModel;
namespace Common
{
public class SetWebBrowser
{
/// <summary>
/// 修改注冊表信息來兼容當前程序
/// </summary>
/// <param name="ieVersion">設置IE版本</param>
public static void SetWebBrowserFeatures(int ieVersion)
{
//如果在Visual Studio中運行in-proc,不要更改注冊表
if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
return;
//獲取程序及名稱
var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
//得到瀏覽器的模式的值
UInt32 ieMode = GeoEmulationModee(ieVersion);
var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";
//設置瀏覽器對應用程序(appName)以什么模式(ieMode)運行
Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",
appName, ieMode, RegistryValueKind.DWord);
Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",
appName, 1, RegistryValueKind.DWord);
//Registry.SetValue(featureControlRegKey + "FEATURE_AJAX_CONNECTIONEVENTS",
// appName, 1, RegistryValueKind.DWord);
//Registry.SetValue(featureControlRegKey + "FEATURE_GPU_RENDERING",
// appName, 1, RegistryValueKind.DWord);
//Registry.SetValue(featureControlRegKey + "FEATURE_WEBOC_DOCUMENT_ZOOM",
// appName, 1, RegistryValueKind.DWord);
//Registry.SetValue(featureControlRegKey + "FEATURE_NINPUT_LEGACYMODE",
// appName, 0, RegistryValueKind.DWord);
}
/// <summary>
/// 獲取瀏覽器的版本
/// </summary>
/// <returns>返回IE版本</returns>
public static int GetBrowserVersion()
{
int browserVersion = 0;
using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer",
RegistryKeyPermissionCheck.ReadSubTree,
System.Security.AccessControl.RegistryRights.QueryValues))
{
var version = ieKey.GetValue("svcVersion");
if (null == version)
{
version = ieKey.GetValue("Version");
if (null == version)
throw new ApplicationException("Microsoft Internet Explorer is required!");
}
int.TryParse(version.ToString().Split('.')[0], out browserVersion);
}
//如果小於7
if (browserVersion < 7)
{
throw new ApplicationException("不支持的瀏覽器版本!");
}
return browserVersion;
}
/// <summary>
/// 通過版本得到瀏覽器模式的值
/// </summary>
/// <param name="browserVersion">瀏覽器版本</param>
/// <returns>瀏覽器模式值</returns>
public static UInt32 GeoEmulationModee(int browserVersion)
{
UInt32 mode = 11000; // DOCTYPE指令在IE11標准模式下顯示。.
switch (browserVersion)
{
case 7:
mode = 7000; // Internet Explorer 7.
break;
case 8:
mode = 8000; // Internet Explorer 8.
break;
case 9:
mode = 9000; // Internet Explorer 9.
break;
case 10:
mode = 10000; // Internet Explorer 10.
break;
case 11:
mode = 11000; // Internet Explorer 11.
break;
}
return mode;
}
}
}
調用:
public partial class FrmWebBrowser : Form
{
public FrmWebBrowser()
{
InitializeComponent();
//獲取瀏覽器版本
int browserVersion = SetWebBrowser.GetBrowserVersion();
//也可以直接輸入調用的版本,例如調用IE11: SetWebBrowser.SetWebBrowserFeatures(11);
//修改注冊表兼容當前程序
SetWebBrowser.SetWebBrowserFeatures(browserVersion);
}
}