一、背景

这几天在维护公司的一个项目,嗯…到现在七八年没人动过了(也是老古董了),都说N年前的代码碰不得 处处是坑 不能挖坑还得一步一步的填坑,恰好今天就填了一坑 此处作为记录 供以后翻阅,对代码除了有些看不懂或者说是很凌乱之外,其他都还行(没注释、有注释的地方是自动生成的英文注释…..、包含 各种委托、事件、多线程、用户控件等等)。

二、问题

对 就是一个CS程序,其中有个功能是输入网址然后展示网页内容,so问题来了 很多网站不支持IE8以下内核的浏览器(很粗暴的跳转到浏览器下载页面~~)。那为什么不用webkit内核的呢…刚刚也说了这是七八年前的代码了…,用的是WebBrowser WebBrowser WebBrowser,说给换一个吧 时间又不允许 而且…你懂的~~(主要是调整太多),也就只能死马当活马医了。

三、解决方式

1.升级IE浏览器

第一时间 想到的就是升级IE浏览器,说干就干 下载安装最新版IE浏览器…重启…运行程序…输入网址… 很粗暴的跳转到浏览器下载页面~~,看来还是太天真… 原来WebBrowser默认使用IE7内核、只升级浏览器是没用的,需要手动指定

2.手动指定WebBrowser内核

浏览了许多资料后,找到了解决方案:改注册表

在开始菜单内输入“regedit.exe”,进入注册表编辑器

找到注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

在右侧空白区域内单击鼠标右键,点击[新建]→[DWORD(32-位)值]

新建的项取名为MyApplication.exe,编辑值时,选择基数“十进制”,填写数值数据,这里填写11000(IE11)

最后运行MyAplication.exe,发现问题已经解决

不同IE版本所对应的DWORD值:

原文:https://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation

但是….这样手动去改注册表始终比较麻烦,本着能用代码解决的问题就尽量用代码来解决的想法,决定改改

3.自动指定WebBrowser内核

思路:检测IE版本、根据不同IE版本返回DWORD值、修改注册表

直接贴代码吧,里面有注释

Code:

  public class IEVersion
{
/// <summary>
/// IE WebBrowser内核设置
/// </summary>
public static void BrowserEmulationSet()
{
//当前程序名称
var exeName = Process.GetCurrentProcess().ProcessName + ".exe";
//系统注册表信息
var mreg = Registry.LocalMachine;
//IE注册表信息
var ie = mreg.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree);
if (ie != null)
{
try
{
var val = ieVersionEmulation(ieVersion());
if (val != 0)
{
ie.SetValue(exeName, val);
}
mreg.Close();
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
} /// <summary>
/// IE版本号
/// </summary>
/// <returns></returns>
static int ieVersion()
{
//IE版本号
RegistryKey mreg = Registry.LocalMachine;
mreg = mreg.CreateSubKey("SOFTWARE\\Microsoft\\Internet Explorer"); //更新版本
var svcVersion = mreg.GetValue("svcVersion");
if (svcVersion != null)
{
mreg.Close();
var v = svcVersion.ToString().Split('.')[0];
return int.Parse(v);
}
else
{
//默认版本
var ieVersion = mreg.GetValue("Version");
mreg.Close();
if (ieVersion != null)
{
var v = ieVersion.ToString().Split('.')[0];
return int.Parse(v);
}
}
return 0;
} /// <summary>
/// 根据IE版本号 返回Emulation值
/// </summary>
/// <param name="ieVersion"></param>
/// <returns></returns>
static int ieVersionEmulation(int ieVersion)
{
//IE7 7000 (0x1B58)
if (ieVersion < 8)
{
return 0;
}
if (ieVersion == 8)
{
return 0x1F40;//8000 (0x1F40)、8888 (0x22B8)
}
if (ieVersion == 9)
{
return 0x2328;//9000 (0x2328)、9999 (0x270F)
}
else if (ieVersion == 10)
{
return 0x02710;//10000 (0x02710)、10001 (0x2711)
}
else if (ieVersion == 11)
{
return 0x2AF8;//11000 (0x2AF8)、11001 (0x2AF9
}
return 0;
}
}

最后,在程序启动时调用:

IEVersion.BrowserEmulationSet();

然后检查注册表,发现已经修改成功。再次运行程序,发现问题已经解决。

以上只是本人解决问题的一个方式方法,不官方不权威,不当之处烦请指正

花了一天时间,解决了一个问题(只是暂时的),想想还是挺悲哀的,这工作效率要是被老板知道了…

这是一个很多年前的代码,即使他很古董,但其中必然有我值得学习的地方,这只是第一步,后面还有许多坑要去填,几年下来也确实累积了许多bug,至少曾经还是辉煌过…

当然,会改版的(正决定往Web版调整呢)….

回头看了看自己的博客,惨(zhi)不(guai)忍(tai)睹(lan),后面还是得多添砖加瓦了

WebBrowser内核指定的更多相关文章

  1. IE WebBrowser内核设置

    public class IEVersion { /// <summary> /// IE WebBrowser内核设置 /// </summary> public stati ...

  2. 设置WebBrowser内核渲染模式

    前不久开发一个项目,是采用WebBrowser作为外壳,加载网页,由于网页是采用html5来进行开发的,当通过WebBrowser加载网页后,html5中的特性 都无法正常显示,而通过ie浏览器打开时 ...

  3. 通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页

    通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页 rem 强制WebBrowser控件使用指定IE版本显示应用的网页 IF EXIST %windir%\Sys ...

  4. C# winform webbrowser如何指定内核为IE11? 输出 this.webbrowser.Version 显示版本是IE11的,但实际版本不是啊! 网上打的修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULA

    最佳答案   1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\M ...

  5. C# winform webbrowser如何指定内核为IE11?

    1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsof ...

  6. C# WebBrowser获取指定字符串的坐标

    public void FindKeyWord(string keyWord) { WebBrowser wb = new WebBrowser(); foreach (HtmlElement ite ...

  7. webbrowser 内核切换

    修改注册表位置: [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER ...

  8. C#使用WebBrowser对指定网页截图

    使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...

  9. C#设置WebBrowser使用Edge内核

    原文:C#设置WebBrowser使用Edge内核 1. 问题描述 用C#写了一个小工具, 需要显示网页上的内容, 但WebBrowser使用的是IE内核, 不能很好的展示网页 2. 解决方法 通过一 ...

随机推荐

  1. Vuforia判断当识别追踪的对象

    方法一,如果有多个识别对象,在Update中循环识别对象数组,获取TrackableBehaviour组件 foreach (var item in trackObjects) { var mTrac ...

  2. SQL Injection(SQL注入漏洞)

    审计前准备: 1.安�php程序(推荐phpStudy) 2.高亮编辑器(推荐 Sublimetext Notepad++) 3.新建一个文本,复制以下变量,这些变量是审计中需要在源码中寻找的 ### ...

  3. 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎

    战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...

  4. 使用staruml学习画类图

    //这是startuml 把uml 转换成的java代码: public class Circle implements Ishape { private double _radius; public ...

  5. SQL SERVER 查询表或字段在哪里使用过

    select b.name from dbo.syscomments a, dbo.sysobjects b where a.id=b.id and b.xtype='p' and a.text li ...

  6. 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。

    在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...

  7. 分析-eclipse已经导入jar包了,但还是出现classNotFound异常

    场景:分析-eclipse已经导入jar包了,但还是出现classNotFound异常 分析--eclipse已经导入jar包了,但还是出现classNotFound错误 最近在做一个web项目时,由 ...

  8. Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Software cache cohere ...

  9. Windows重启网络命令

    netsh winsock reset ipconfig /flushdns

  10. 微信小程序开发POST请求

    onLoad: function() { that = this; wx.request( { url: "http://op.juhe.cn/onebox/weather/query&qu ...