Winfrom 中完美设置webbrowser控件内核版本
前言
.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);
        }
    }
												
											Winfrom 中完美设置webbrowser控件内核版本的更多相关文章
- c# webbrowser控件内核版本强制修改
		
int BrowserVer, RegVal; // get the installed IE version using (WebBrowser Wb = new WebBrowser()) Bro ...
 - C/S模式开发中如何利用WebBrowser控件制作导航窗体
		
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
 - WPF 设置WebBrowser控件不弹脚本错误提示框
		
using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.N ...
 - .net 设置webbrowser控件使用的IE版本
		
当我们在使用.net的Webbrowser控件时,发现webbrowser展示的内容和我们用浏览器展示的内容不一致,甚至出现:'JSON' is undefined. 原因是webbrowser使用的 ...
 - 记客户端WebBrowser控件修改版本的问题
		
保留在本地电脑的一篇记录,第二条描述是在网上看来的,忘记在哪看的了,也就没注明出处,望见谅. 1.Winform内置浏览器控件的底层调用与系统IE浏览器的底层调用相同. 2.IE8 对渲染引擎做了很大 ...
 - winfrom中DataGridView绑定数据控件中DataGridViewCheckBoxColumn怎么选中
		
; i < this.dataGridView1.Rows.Count; i++) { this.dataGridView1.Rows[i].Cells["CheckBoxCulums ...
 - VB.NET让webbrowser控件中JS脚本错误最新方法(2013-09-16)
		
最近也是在项目中遇到了webbrowser控件中想关闭JS脚本错误窗口的问题,所以经过多次测试,终于用一段高效实用的代码完美解决webbrowser控件中JS脚本错误窗口关闭的问题. 通过创建一个子线 ...
 - c#中WebBrowser控件的使用方法
		
首先先来简单介绍一下webbrowser控件,这个控件是可以实现在form窗体中添加网页内容的.如图,我在form中加入了百度api,(百度地图api调用博客里有讲) 使用这个控件其实很简单 (1)第 ...
 - winform中WebBrowser控件执行脚本
		
在实际应用中我们可能需要WebBrowser控件主动执行我们需要的脚本,执行脚本现在有两种方法. 1.WebBrowser控件加载脚本,简单方便,适用于简短的脚本,无法执行复杂操作. webBrows ...
 
随机推荐
- 【springboot】集成swagger
			
1.简介 本章介绍 SpringBoot2.1.9 集成 Swagger2 生成在线的API接口文档. 2. pom依赖: 通过对比了swagger的几个版本,发现还是2.6.1问题最少 <!- ...
 - C#的生产者和消费者 实例
			
class Program { //写线程将数据写入myData static int myData = 100; //读写次数 const int readWriteCount = 20; //fa ...
 - 解析一个HTML字符串
			
存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它.怎么办?jsonu能够帮你轻松解决这些问题 解决方法 使用静态Jsoup ...
 - 微信小程序学习笔记四 自定义组件
			
1. 自定义组件 类似Vue或react中的自定义组件 小程序允许我们使用自定义组件的方式来构建页面 1.1 创建自定义组件 类似于页面, 一个自定义组件由json wxml wxss js 4个文件 ...
 - [Kotlin Tutorials 19] Kotlin Flows, SharedFlow and StateFlow in Android
			
Kotlin Flows 本文包含的内容: Flow是什么, 基本概念和用法. Flow的不同类型, StateFlow和SharedFlow比较. Flow在Android中的使用 安全收集. 操作 ...
 - openstack新建实例各种报错解决
			
最近自己装了下Openstack,零基础安装,参照了网上不少教程. 吃了百家饭的后果,就是出现了一堆不明问题...openstack安装比较复杂,很多配置文件,一个地方配置不正确,可能会导致后面的功能 ...
 - Shell脚本逐行读取文本内容并拆分,根据条件筛选文件
			
时间:2018-11-13 整理:byzqy 需求: 最近帮朋友写了一段脚本,他的需求是根据一份产品清单,去服务器上捞取对应产品编号的测试Log,数量大概有9000~10000条左右.文本内容大致如下 ...
 - Servlet监听器详解及举例
			
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 ...
 - Linux系统的内核编译
			
<1>给虚拟机分配2048M内存 <2>配置高可用yum源 <3>下载软件 <1>安装内核源码包 根据依赖性提示,安装对应的包 下载并安装软件包(3个) ...
 - 【图像处理】使用SDL预览webp图片
			
写在前面的话 WebP是Google开发的一种图像格式,支持图像数据的有损和无损压缩.保留动画和alpha透明通道数据. 可以创建和JPEG.PNG和GIF图像格式在质量相同或质量更高,但是数据更小的 ...