zoukankan      html  css  js  c++  java
  • 设置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);
       }
      }
    }

               

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

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

     

    说明大功告成了!

  • 相关阅读:
    PAT 解题报告 1009. Product of Polynomials (25)
    PAT 解题报告 1007. Maximum Subsequence Sum (25)
    PAT 解题报告 1003. Emergency (25)
    PAT 解题报告 1004. Counting Leaves (30)
    【转】DataSource高级应用
    tomcat下jndi配置
    java中DriverManager跟DataSource获取getConnection有什么不同?
    理解JDBC和JNDI
    JDBC
    Dive into python 实例学python (2) —— 自省,apihelper
  • 原文地址:https://www.cnblogs.com/ForOne/p/3778725.html
Copyright © 2011-2022 走看看