前不久開發一個項目,是采用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"; try FEATURE_BROWSER_EMULATION", true); { |
修改注冊表之后運行效果如下:
說明大功告成了!