在 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 執行層級
沒有留言:
張貼留言