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),后面还是得多添砖加瓦了

时间: 2024-08-01 05:33:12

WebBrowser内核指定的相关文章

设置WebBrowser内核渲染模式

前不久开发一个项目,是采用WebBrowser作为外壳,加载网页,由于网页是采用html5来进行开发的,当通过WebBrowser加载网页后,html5中的特性 都无法正常显示,而通过ie浏览器打开时能够正常显示,经过研究发现WebBrowser默认是通过ie7的兼容模式来进行渲染,因此html5的特性无法显示.那么 我们该如何更改WebBrowser内核的渲染模式呢? Internet Explorer Architecture 首先了解一下IE的整个架构,如下图 ShDocVw 及以下就是W

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\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION 3)添加以下项 IE各版本的值如下: 11001 (0x2EDF) Internet Explorer 11. Webpages are displayed

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

1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION 3)添加以下项 IE各版本的值如下: 11001 (0x2EDF) Internet Explorer 11. Webpages are displayed in IE

winfrom中的webbrowser内核版本修改

vs2008,winfrom中的webbrowser  其内核默认为IE7,当网页中存在IE7不支持的属性时回报错. private void Form1_Load(object sender, EventArgs e) { SetWebBrowserFeatures(11); } static void SetWebBrowserFeatures(int ieVersion) { // don't change the registryif running in-proc inside Vis

webbrowser 内核切换

修改注册表位置: [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION] 右边添加自己的程序名称及需要使用的IE内核版本, 如: 版本代码对应: Edge 0x2EE1 IE11强制模式 0x2EDF IE11标准模式 0x2AF8 IE10强制模式 0x2AF7 IE10标准模式 0x2710 IE9强制模式 0x270F IE9标准模式 0x2

Linux入门之CentOS7内核编译三部曲(1)

Linux入门之CentOS7内核编译三部曲(1) 我们知道,一个Linux系统的主要组成是由liunx内核核心和一些支持模块组合而成的.但是在某些场合中,需要某项功能,而当前内核的核心或者模块不支持此功能,那么就需要对内核进行一个升级或者重新编译内核添加相应的功能,以此提供了对此功能的支持. 编译前的准备 认识kernel 所为kernel,就是一种操作系统的核心,当然也是一个文件,而这种核心提供了对一些硬件的支持,一般来说其中包含了一些对常见硬件核心驱动的核心代码.启动系统时会通过加载MBR

【转载】linux内核笔记之高端内存映射

原文:linux内核笔记之高端内存映射 在32位的系统上,内核使用第3GB~第4GB的线性地址空间,共1GB大小.内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口. 引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对于80x86开启PAE的情况下,允许的最大物理内存可达到64G,因此内核将自己的最后128M的线

【转】linux内核kallsyms机制分析

一.前言 Linux内核是一个整体结构,而模块是插入到内核中的插件.尽管内核不是一个可安装模块,但为了方便起见,Linux把内核也看作一个模块.那么模块与模块之间如何进行交互呢,一种常用的方法就是共享变量和函数.但并不是模块中的每个变量和函数都能被共享,内核只把各个模块中主要的变量和函数放在一个特定的区段,这些变量和函数就统称为符号. 因此,内核也有一个module结构,叫做kernel_module.另外,从kernel_module开始,所有已安装模块的module结构都链在一起成为一条链,

研究议题:udev是否能够根据pci指定盘符

研究的议题:如何通过pci插槽绑定设备名称但是udev扫描插槽的时候,并不知道插槽的具体命名方式,并且不同机器的插槽是否一样的命名,如果只是通过size,是否可行. 操作步骤1: ID=="host2",SUBSYSTEM="block",NAME="mydisk"invalid SUBSYSTEM operation 由于SUBSYSTEM的编写规则出现错误,必须是==正确如下:ID=="host2",SUBSYSTEM==