2013年6月26日 星期三

自訂應用程式中的 WebBrowser 版本

寫 Web 的人都了解,有個讓網頁開發者很困擾的問題,就是各家瀏覽器對 HTML、CSS 的表現不一致,這種現像尤其在微軟的 Internet Explorer 上更明顯,雖然 IE 9、10 已經明顯的趕上其他瀏覽器,但並不是所有的電腦用戶都會理解網頁看起來怪怪的是瀏灠器版本的問題而自行更新瀏覽器。

在 Windows 應用程式中如果有包含 WebBrowser 來顯示網頁與應用程式互動時,常常可以發現 WebBrowser 並不是作業系統中安裝的 IE 最新版,如此寫網頁的同事可能會碰到各瀏覽器行為、顯示樣式不一致的問題而必須多寫一些判斷。

想要讓應用程式中的 WebBrowser 使用作業系統中的最新版 Browser 其實是可行的,方式是將應用程式的名字與希望使用的最高 IE 版本寫入系統 Registry 即可。

相關資料可以參考這裡:Internet Feature Controls
直接跳到 Browser Emulation 這個項目看看即可,此處列出各版本的 IE 該填入怎樣的 Registry Value,大致上的方法就是在下面的位置增加一個 key 為應用程式名稱.exe 且 value 為 Browser 版本對應值的機碼

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

相關程式碼如下

HKEY hKey(0);
if(ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION"), &hKey))
{
DWORD dwValue(10000);
if(ERROR_SUCCESS != RegSetValueEx(hKey, _T("WebBrowserSample.exe"), NULL, REG_DWORD, (BYTE*)&dwValue, sizeof(DWORD)))
{
// 提示寫入失敗
}
}
RegCloseKey(hKey);

這邊還有一個有趣的問題,如果你的作業系統是 64-bits 的版本,在這個路徑下可能會令人意外的沒什麼機碼,包括你自已寫入剛才寫入的機碼在這裡也找不到,原因可以參考我的另一篇分享:32-bits、64-bits 作業系統的 Registry 注意事項

所以在 64-bits 的作業系統下,到這裡看看應該可以找到剛才寫入的機碼,如果你有在 x64 的 OS 上裝 Skype 應該會看到 Skype 也在這裡寫了值進去

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

關於 Value 的部份,除非很明確的要使用哪一版的 IE 呈現方式,否則其實並不用太嚴格的在意作業系統有哪些版本的 IE,一律指定最高的數值就好,如 10001 (Internet Explorer 10. Webpages are displayed in IE10 Standards mode),作業系統若沒有該版本的 IE 即會調用系統中所擁有的最新版 IE。

改完之後,只要簡單的寫一個網頁可以秀出 User Agent 的網頁,即可以從列出來的值看出有加這個機碼與沒加之前的差異了,以下是 IE 10 的 User Agent

mozilla/5.0 (compatible; msie 10.0; windows nt 6.2; wow64; trident/6.0; .net4.0e; .net4.0c; .net clr 3.5.30729; .net clr 2.0.50727; .net clr 3.0.30729; infopath.1)

此外,如果發現寫不進去,可以檢查看看是不是應用程式權限的問題,因為在 HKEY_LOCAL_MACHINE 中建立機碼是需要 Administrator 權限的,可以參考此處:自訂應用程式的 UAC 執行層級

沒有留言:

張貼留言