• 设置WebBrowser内核渲染模式


    前不久开发一个项目,是采用WebBrowser作为外壳,加载网页,由于网页是采用html5来进行开发的,当通过WebBrowser加载网页后,html5中的特性

    都无法正常显示,而通过ie浏览器打开时能够正常显示,经过研究发现WebBrowser默认是通过ie7的兼容模式来进行渲染,因此html5的特性无法显示。那么

    我们该如何更改WebBrowser内核的渲染模式呢?

    Internet Explorer Architecture

    首先了解一下IE的整个架构,如下图

    ShDocVw 及以下就是WebBrowser的内容,而Browser UI和IE自己的一些特有的功能不属于WebBrowser所有。 当然,不是说要做自己的基于IE的浏览器

    就非得用WebBrowser, 我们完全可以直接使用 MSHTML 去控制和绘制DOM,跳过WebBrowser。

    不少软件都内嵌了IE的WebBrowser控件(也就是MSHTML.dll)来显示网页, 当用户机器升级到某个IE版本时, WebBrowser控件也会随之升级到相应的

    IE版本对应的渲染引擎。为了保证这些使用WebBrowser控件的应用软件能够工作起来和原来一样,不同IE版本的WebBrowser控件在默认情况下使用了IE7 的

    渲染模式。

    设置WebBrowser渲染模式

    如下,一个WebBrowser加载一个为w3school的网页,其中包含一个video标签,IE默认情况下是使用IE7兼容模式渲染,预期是video是无法显示的。

    <Grid>

    <WebBrowser Source="http://www.w3school.com.cn/tiy/t.asp?f=html5_video_dom"></WebBrowser>

    </Grid>

    运行效果如下:

    提示"Your browser does not support HTML5 video",说明WebBrowser中默认不是采用本地机器IE版本对应的模式来渲染的,接下来我们通过修改注册表,来使

    WebBrowser支持HTML5的属性,既采用更高ie版本的内核来进行渲染。

    修改注册表设置WebBrowser内核的渲染模式

    1、安装包在安装的时候,先从注册表里获取到系统的IE 版本号,如果是 IE 8 以下,就跳过本逻辑。版本号的获取可以从这里读取:
    32位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version
    64位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Version

    2、在注册表对应的位置创建键值,键为用到 web browser 控件的程序的名称,例如 WebBrowser.exe (不需要完整的路径,带扩展名的完整文件名就可以了),值

    为第一步获取到的版本值。MSDN 上显示一共有 9 个枚举值(http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx#browser_emulation),可以根据实际情

    况来设置,例如 十进制的9。注册表的位置为:
    32位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
    64位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

    示例代码

     

    var exeName = Process.GetCurrentProcess().ProcessName + ".exe";
    var hklm = Registry.LocalMachine;

    try
    {
      var lmRun = hklm.OpenSubKey( @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\

    FEATURE_BROWSER_EMULATION", true);
      if (lmRun != null)               

    {
        try
        {
          lmRun.SetValue(exeName, 0x2710); //
    设置webbrowser调用IE10内核打开
        }
        catch (Exception ex)
        {
          Console.Write(ex.Message);
       }
      }
    }

               

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    修改注册表之后运行效果如下:

     

    说明大功告成了!

  • 相关阅读:
    Revit 二次开发参照属性
    存储过程分页 (多条件拼接)
    Dapper的使用
    C#实现简单的邮件发送
    ORM 简介
    Web Services简介
    事物、锁、存储过程
    游标和触发器简介
    ASP.NET 上传文件方法
    C# Web API 实现上传功能
  • 原文地址:https://www.cnblogs.com/ForOne/p/3778725.html
Copyright © 2020-2023  润新知