之前有几个项目,在winform的程序里面内嵌了一个webbroswer,但是使用发现webbroswer的兼容性很差,查看了一下内核,发现是IE7的,所以以为是vs自带的低版本的IE,但是查找答案后发现,没有安装IE的电脑是无法使用webbroswer的,因此,webbroswer首先是依赖于IE的,只是默认版本是IE7

查找相关的资料加亲身实践,最终找到了解决方法:

首先,我们要设置注册表,下面的位数指的是应用程序的位数而不是操作系统的位数:

32 位:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

键名: yourapplication.exe

64 位:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

键名: yourapplication.exe

然后是键的值,如下,具体描述见MSDN

7000 (0x1B58)
包含标准!DOCTYPE指令的页面将会以IE7兼容模式打开。WebBrowser控件的默认值。

8000 (0x1F40)
包含标准!DOCTYPE指令的页面将会以IE8兼容模式打开,IE8浏览器的默认值。对于IE10来说,包含标准!DOCTYPE指令的页面会以IE10兼容模式打开。

8888 (0x22B8)
无论是否声明!DOCTYPE指令,页面以IE8兼容模式打开。对于未正确声明!DOCTYPE指令的页面,将会以怪异模式(quirks mode)加载。

9000 (0x2328)
IE9,包含标准!DOCTYPE指令的页面将会以IE9兼容模式打开,IE9浏览器的默认值。对于IE10来说,包含标准!DOCTYPE指令的页面会以IE10兼容模式打开。

9999 (0x270F)
IE9,无论是否声明!DOCTYPE指令,页面以IE9兼容模式打开。对于未正确声明!DOCTYPE指令的页面,将会以怪异模式(quirks mode)加载。

10000 (0x02710)
IE10,包含标准!DOCTYPE指令的页面将会以IE10兼容模式打开,IE10浏览器的默认值。

10001 (0x2711)
IE10,无论是否声明!DOCTYPE指令,页面以IE10兼容模式打开。

11001 (0x2AF9)
IE11,包含标准!DOCTYPE指令的页面将会以IE11兼容模式打开,IE11浏览器的默认值。

11000 (0x2AF8)
IE11,无论是否声明!DOCTYPE指令,页面将会以IE11的edge模式打开。对于未正确声明!DOCTYPE指令的页面,将会以怪异模式(quirks mode)加载。

最后,为了方便使用,附上修改注册表的代码:

/// <summary>  
/// 修改注册表信息来兼容当前程序  
///   
/// </summary>  
static void SetWebBrowserFeatures(int ieVersion)
{
	// don't change the registry if running in-proc inside Visual Studio  
	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);
	// enable the features which are "On" for the full Internet Explorer browser  
	//不晓得设置有什么用  
	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></returns>  
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>  
static UInt32 GeoEmulationModee(int browserVersion)
{
	UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode.   
	switch (browserVersion)
	{
		case 7:
			mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode.   
			break;
		case 8:
			mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode.   
			break;
		case 9:
			mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.                      
			break;
		case 10:
			mode = 10000; // Internet Explorer 10.  
			break;
		case 11:
			mode = 11000; // Internet Explorer 11  
			break;
	}
	return mode;
}

测试的话可以到https://www1.pconline.com.cn/pcedu/specialtopic/css3-doraemon/ 这个网站去测试

最后还要说一点,DEBUG模式可能不会马上生效,要生效的话最好改成RELEASE模式

小广告:关于获取西普实验吧所有Writeup请点击这里查看索引

查看所有Flag需要付费,需要获取所有Flag的童鞋请访问这里成为付费用户,可以自助把自己的注册邮箱加入网站白名单,即可免回复看到本站所有Flag

Flag大全地址:所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜,如果喜欢我的博客,愿意捐赠的,可以扫描下面的二维码

微信二维码:
支付宝二维码: