首先說一下原理
當下很大瀏覽器他們都是用了IE的core, 這個core只提供HTML/JS的執行和渲染,並沒有給出關於界面和一些特性上的事,所以開發自己瀏覽器如果基於IE core需要自己完成這些內容。 一張圖很好的說明了這個情況,IE瀏覽器的架構:http://msdn.microsoft.com/en-us/library/aa741312(VS.85).aspx
ShDocVw 及以下就是WebBrowser的內容,而Browser UI和IE自己的一些特有的功能不屬於WebBrowser所有。 當然,不是說要做自己的基於IE的瀏覽器就非得用WebBrowser, 我們完全可以直接使用 MSHTML 去控制和繪制DOM,跳過WebBrowser。
那么可不可以修改它綁定的內核呢?
這是可以的:
IE8 在渲染引擎做了很大的改動,新增加一個標准模式 (Standard Mode)。 不少軟件都內嵌了IE的WebBrowser控件(也就是MSHTML.dll)來顯示網頁, 當用戶機器升級到IE8, WebBrowser控件也會隨之升級到IE8的渲染引擎。
為了保證這些使用WebBrowser控件的應用軟件能夠工作起來和原來一樣,IE8的WebBrowser控件在默認情況下使用了IE7 的渲染模式(也就是IE8中的Compatible View (兼容視圖)模式)。
方法一
加入你想讓WebBrowser控件的渲染模式編程IE8的標准模式, 你可以通過設置注冊表FEATURE_BROWSER_EMULATION 來實現。
示例:
注冊表中注明當前本機裝的IE版本
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer
下面有名稱為Version的項,其值為IE的版本.
svcVersion =10.0.9200.16618
Version =9.10.9200.16618
[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8000 (Hex: 0x1F40)
這里MyApplicaiton.exe 是你的應用程序的EXE文件名。 8000 表示8.0的渲染模式,請對照下表:
IE8 Standards Mode 8000 (0x1F40) -- IE8 標准模式 (Standard Mode), IE8默認的模式
IE7 Standards Mode 7000 (0x1B58) -- IE7 兼容視圖模式 (Compatible View), IE8的WebBrowser控件默認模式
IE8 Standards Mode (Forced) 8888 (0x22B8) -- IE8 強制標准模式,在渲染失敗的情況下不嘗試用兼容視圖模式
方法二
在html頭 加標簽 強制使用最新的ie渲染 <meta http-equiv="X-UA-Compatible" content="IE=edge">
強制使用最新的ie8渲染<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8"/>
修改案例:
void WINAPI WriteWebBrowserRegKey(LPCTSTR lpKey,DWORD dwValue)
{
HKEY hk;
CString str = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\";
str += lpKey;
if (RegCreateKey(HKEY_LOCAL_MACHINE,str,&hk)!=0)
{
MessageBox(NULL,"打開注冊表失敗!","Error",0);
ExitProcess(-1);
}
if (RegSetValueEx(hk,"你的exe名稱.exe",NULL,REG_DWORD,(const byte*)&dwValue,4)!=0)
{
RegCloseKey(hk);
MessageBox(NULL,"寫注冊表失敗!","Error",0);
ExitProcess(-1);
}
RegCloseKey(hk);
}
WriteWebBrowserRegKey("FEATURE_BROWSER_EMULATION",9000);
// WriteWebBrowserRegKey("FEATURE_ACTIVEX_REPURPOSEDETECTION",1);
WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_IMG",1);
WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_OBJECT",1);
WriteWebBrowserRegKey("FEATURE_BLOCK_LMZ_SCRIPT",1);
WriteWebBrowserRegKey("FEATURE_Cross_Domain_Redirect_Mitigation",1);
WriteWebBrowserRegKey("FEATURE_ENABLE_SCRIPT_PASTE_URLACTION_IF_PROMPT",1);
WriteWebBrowserRegKey("FEATURE_LOCALMACHINE_LOCKDOWN",1);
WriteWebBrowserRegKey("FEATURE_GPU_RENDERING",1);
參考資料
現在就去仔細查一下權威資料,核實一下兩個問題:
1.Webbrowser與IE到底是什么關系?是否確實用ie內核, 是否本質上和360安全瀏覽器,傲游瀏覽器和騰訊TT等IE內核瀏覽器相同。
2.Webbrowser是否使用兼容瀏覽模式,以及這個模式是否能改?
二.查詢結果
1.webbrowser調用的就是本機IE9,並且webbrowser默認就是運行在IE7 mode下,除非你改變它.
發現一個msdn的帖子,明確表示webbrowser調用的就是本機IE9,並且webbrowser默認就是運行在IE7 mode下,除非你改變它。
How to make c# WebBrowser equivalent to IE browser
http://social.msdn.microsoft.com/Forums/en/winforms/thread/2ed65b9d-c601-4ca8-bde1-64584fc87515
摘幾句:
Wow first post with such bold claim without any source backing up. You probably should read the IE SDK (the manual you need to read if you want to use the webbrowser control) or dig through the IE programming forums (that's the place others often go when they are stuck on IE programming) if you want to use the webbrowser control.
Webbrowser is a wrapper around IE APIs. There is no such thing as multiple versions of IE coexisting on the same computer. You will always get the one and only version of IE installed on the computer from webbrowser control.
There are many, many documented setting differences between default IE and webbrowser. Basically you don't have to opt out new features in webbrowser that may break your app (the Visual Studio team learned a hard lesson here, when IE8 breaks Visual Studio's wizards) , you have to write code to opt in, unless the improvement is security related. That means the webbrowser will run in IE7 mode unless you change the mode in feature control.
Note some web site declare their requirement of IE7 or IE8 mode. It may not be wise to force the IE9 mode.
2.微軟新聞組的一個帖子,Webbrowser Control without IE,里面明確提到,不裝IE,無法用webbrowser.
http://groups.google.com/group/microsoft.public.vb.controls/browse_thread/thread/7575bd25e0730ded/aa40f3dfc799407d?lnk=gst&q=WebBrowser+ie#aa40f3dfc799407d
IE must be installed on the machine for you to use Webbrowser Control.
Internet Explorer MUST be installed to use the WebBrowser control. There are simply no ifs, ands, or buts about it. How can you expect to use IE functionality if IE is not installed?
3.如何設置WebBrowser在IE9 mode下工作呢?
答曰:需要修改注冊表,具體看下面4,5,6,尤其6最全面,可以光看6。
4.WPF webbrowser control using IE7 instead of IE9
http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/4431908e-1869-4435-bcea-a3ec0820edfb
摘抄幾句:
How do I make it so the WPF WebBrowser control will use IE9 as the browser engine instead of IE7?
I have some HTML that is rendering differently in the WebBrowser control than in the IE9 browser. When I run the following javascript in the WebBrowser, the result is "7". as in IE7.
I found an article by Rick Strahl that describes registry settings that will get the WebBrowser to use IE9. But I would like to avoid that. And I am interested to know how IE7 comes about being used.http://www.west-wind.com/weblog/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version
回答:You want to avoid the only documented way to set document compatibility mode for webbrowser hosts? Why?
5.WebBrowser and CSS3 ?
http://social.msdn.microsoft.com/Forums/en-AU/winforms/thread/1b656af7-bda9-47d9-8f9a-1d886d3688ca
Web browser control by default runs in compatibility mode unless you set the feature browser emulation registry key. The fact that IE9 is able to render CSS3 correctly and browser control is not seems to suggest browser control is not running in IE9 standards mode.
You'll need to set Browser emulation feature key (FEATURE_BROWSER_EMULATION) described at this link http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx
You can use 9000 value, unless you want to force IE 9 standards mode for all pages. In case of later, you need to use 9999.
hklm
If hklm and 64bit machine used, you need to check is Wow6432Node needs to be changed.
And finally you need to add process name hosting browser control as value name in the registry key.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION]
"prevhost.exe"=dword:00001f40
"sllauncher.exe"=dword:00001f40
"WindowsFormsApplication1.exe"=dword:0000270f
6.Web Browser Control – Specifying the IE Version
http://www.west-wind.com/weblog/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version
I use the Internet Explorer Web Browser Control in a lot of my applications to display document type layout. HTML happens to be one of the most common document formats and displaying data in this format – even in desktop applications, is often way easier than using normal desktop technologies.
One issue the Web Browser Control has that it’s perpetually stuck in IE 7 rendering mode by default. Even though IE 8 and now 9 have significantly upgraded the IE rendering engine to be more CSS and HTML compliant by default the Web Browser control will have none of it. IE 9 in particular – with its much improved CSS support and basic HTML 5 support is a big improvement and even though the IE control uses some of IE’s internal rendering technology it’s still stuck in the old IE 7 rendering by default.
This applies whether you’re using the Web Browser control in a WPF application, a WinForms app, a FoxPro or VB classic application using the ActiveX control. Behind the scenes all these UI platforms use the COM interfaces and so you’re stuck by those same rules.
Feature Delegation via Registry Hacks
Fortunately starting with Internet Explore 8 and later there’s a fix for this problem via a registry setting. You can specify a registry key to specify which rendering mode and version of IE should be used by that application. These are not global mind you – they have to be enabled for each application individually.
There are two different sets of keys for 32 bit and 64 bit applications.
32 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
Value Key: yourapplication.exe
64 bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
Value Key: yourapplication.exe
The value to set this key to is (taken from MSDN here) as decimal values:
9999 (0x270F)
Internet Explorer 9. Webpages are displayed in IE9 Standards mode, regardless of the !DOCTYPE directive.
9000 (0x2328)
Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.
8888 (0x22B8)
Webpages are displayed in IE8 Standards mode, regardless of the !DOCTYPE directive.
8000 (0x1F40)
Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode.
7000 (0x1B58)
Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode.