WebBrowser内核指定
一、背景
这几天在维护公司的一个项目,嗯…到现在七八年没人动过了(也是老古董了),都说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内核指定的更多相关文章
- IE WebBrowser内核设置
public class IEVersion { /// <summary> /// IE WebBrowser内核设置 /// </summary> public stati ...
- 设置WebBrowser内核渲染模式
前不久开发一个项目,是采用WebBrowser作为外壳,加载网页,由于网页是采用html5来进行开发的,当通过WebBrowser加载网页后,html5中的特性 都无法正常显示,而通过ie浏览器打开时 ...
- 通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页
通过批处理操作注册表实现winform应用中Webbrowser以指定的IE版本加载网页 rem 强制WebBrowser控件使用指定IE版本显示应用的网页 IF EXIST %windir%\Sys ...
- 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 ...
- C# winform webbrowser如何指定内核为IE11?
1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsof ...
- C# WebBrowser获取指定字符串的坐标
public void FindKeyWord(string keyWord) { WebBrowser wb = new WebBrowser(); foreach (HtmlElement ite ...
- webbrowser 内核切换
修改注册表位置: [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER ...
- C#使用WebBrowser对指定网页截图
使用webbrowser获取html,然后输出的位图即可. WebBrowser wb = new WebBrowser(); // 创建一个WebBrowser wb.ScrollBarsEnabl ...
- C#设置WebBrowser使用Edge内核
原文:C#设置WebBrowser使用Edge内核 1. 问题描述 用C#写了一个小工具, 需要显示网页上的内容, 但WebBrowser使用的是IE内核, 不能很好的展示网页 2. 解决方法 通过一 ...
随机推荐
- phonegap3.5了结
搞了三天的phonegap3.5.最后怎么搞都搞不好了.修改了www中的index.html的内容,clean也不行,在node.js中cordova build也不行. 反正就是apk没有更新啦.至 ...
- #20145205 《Java程序设计》第10周学习总结
教材学习内容总结 教材学习内容总结 Java的网络编程 •网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. •java.net包中J2SE的API包含有类和接口,它们提供低 ...
- 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/1/5
[iCore3 ARM代码下载地址][全部]DEMO1.0测试程序发布例程一:ARM驱动三色LED例程二:读取arm按键状态例程三:EXTI中断输入实验——读取ARM按键状态例程四:USART通信实验 ...
- Notif
<?php/** * 支付宝通知接口 * @author YinKu.Alan * @date 2016-03-06 */class NotifyAction extends CommonAct ...
- 算法系列(1):Google方程式
有一个字符组成的等式:WWWDOT – GOOGLE = DOTCOM,每个字符代表一个0-9之间的数字,WWWDOT.GOOGLE和DOTCOM都是合法的数字,不能以0开头.请找出一组字符和数字的对 ...
- PARALLEL PROCESSING
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION
- VC中对文件的读写
http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理 ...
- CG_INLINE,inline 内联函数
内联函数,即在编译的时候将函数体替换函数调用,从而不需要将parameter,return address进行push/pop stack的操作,从而加速app的运行,然而,会增加二进制文件的大小. ...
- Linux图形&命令行界面切换
1.实时切换 1.1 命令行->图形 startx 1.2 图形->命令行 Ctrl+Alt+F1--F6 2.启动默认 2.1 启动进入命令行 修改/etc/inittab文件 &quo ...
- [原创]快速指定SQLDeveloper所使用JDK的方法
就众多的免费SQL开发工具来讲,Oracle出品的SQLDeveloper 还是一个很不错的选择. 看到网上不少的帖子讨论SQL Developer 启动的时候报告找不到Java Home(或JDK) ...

