設置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);
   }
  }
}

           

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

修改注冊表之后運行效果如下:

 

說明大功告成了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM