一、背景 這幾天在維護公司的一個項目,嗯…到現在七八年沒人動過了(也是老古董了),都說N年前的代碼碰不得 處處是坑 不能挖坑還得一步一步的填坑,恰好今天就填了一坑 此處作為記錄 供以後翻閱,對代碼除了有些看不懂或者說是很凌亂之外,其他都還行(沒註釋、有註釋的地方是自動生成的英文註釋…..、包含 各種 ...
一、背景
這幾天在維護公司的一個項目,嗯…到現在七八年沒人動過了(也是老古董了),都說N年前的代碼碰不得 處處是坑 不能挖坑還得一步一步的填坑,恰好今天就填了一坑 此處作為記錄 供以後翻閱,對代碼除了有些看不懂或者說是很凌亂之外,其他都還行(沒註釋、有註釋的地方是自動生成的英文註釋…..、包含 各種委托、事件、多線程、用戶控制項等等)。
二、問題
對 就是一個CS程式,其中有個功能是輸入網址然後展示網頁內容,so問題來了 很多網站不支持IE8以下內核的瀏覽器(很粗暴的跳轉到瀏覽器下載頁面~~)。那為什麼不用webkit內核的呢…剛剛也說了這是七八年前的代碼了…,用的是WebBrowser WebBrowser WebBrowser,說給換一個吧 時間又不允許 而且…你懂的~~(主要是調整太多),也就只能死馬當活馬醫了。
三、解決方式
1.升級IE瀏覽器
第一時間 想到的就是升級IE瀏覽器,說乾就乾 下載安裝最新版IE瀏覽器…重啟…運行程式…輸入網址… 很粗暴的跳轉到瀏覽器下載頁面~~,看來還是太天真… 原來WebBrowser預設使用IE7內核、只升級瀏覽器是沒用的,需要手動指定
2.手動指定WebBrowser內核
瀏覽了許多資料後,找到瞭解決方案:改註冊表
在開始菜單內輸入“regedit.exe”,進入註冊表編輯器
找到註冊表項:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION
在右側空白區域內單擊滑鼠右鍵,點擊[新建]→[DWORD(32-位)值]
新建的項取名為MyApplication.exe,編輯值時,選擇基數“十進位”,填寫數值數據,這裡填寫11000(IE11)
最後運行MyAplication.exe,發現問題已經解決
不同IE版本所對應的DWORD值:
原文:https://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation
但是….這樣手動去改註冊表始終比較麻煩,本著能用代碼解決的問題就儘量用代碼來解決的想法,決定改改
3.自動指定WebBrowser內核
思路:檢測IE版本、根據不同IE版本返回DWORD值、修改註冊表
直接貼代碼吧,裡面有註釋
Code:
public class IEVersion { /// <summary> /// IE WebBrowser內核設置 /// </summary> public static void BrowserEmulationSet() { //當前程式名稱 var exeName = Process.GetCurrentProcess().ProcessName + ".exe"; //系統註冊表信息 var mreg = Registry.LocalMachine; //IE註冊表信息 var ie = mreg.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", RegistryKeyPermissionCheck.ReadWriteSubTree); if (ie != null) { try { var val = ieVersionEmulation(ieVersion()); if (val != 0) { ie.SetValue(exeName, val); } mreg.Close(); } catch (Exception ex) { Console.Write(ex.Message); } } } /// <summary> /// IE版本號 /// </summary> /// <returns></returns> static int ieVersion() { //IE版本號 RegistryKey mreg = Registry.LocalMachine; mreg = mreg.CreateSubKey("SOFTWARE\\Microsoft\\Internet Explorer"); //更新版本 var svcVersion = mreg.GetValue("svcVersion"); if (svcVersion != null) { mreg.Close(); var v = svcVersion.ToString().Split('.')[0]; return int.Parse(v); } else { //預設版本 var ieVersion = mreg.GetValue("Version"); mreg.Close(); if (ieVersion != null) { var v = ieVersion.ToString().Split('.')[0]; return int.Parse(v); } } return 0; } /// <summary> /// 根據IE版本號 返回Emulation值 /// </summary> /// <param name="ieVersion"></param> /// <returns></returns> static int ieVersionEmulation(int ieVersion) { //IE7 7000 (0x1B58) if (ieVersion < 8) { return 0; } if (ieVersion == 8) { return 0x1F40;//8000 (0x1F40)、8888 (0x22B8) } if (ieVersion == 9) { return 0x2328;//9000 (0x2328)、9999 (0x270F) } else if (ieVersion == 10) { return 0x02710;//10000 (0x02710)、10001 (0x2711) } else if (ieVersion == 11) { return 0x2AF8;//11000 (0x2AF8)、11001 (0x2AF9 } return 0; } }
最後,在程式啟動時調用:
IEVersion.BrowserEmulationSet();
然後檢查註冊表,發現已經修改成功。再次運行程式,發現問題已經解決。
以上只是本人解決問題的一個方式方法,不官方不權威,不當之處煩請指正
花了一天時間,解決了一個問題(只是暫時的),想想還是挺悲哀的,這工作效率要是被老闆知道了…
這是一個很多年前的代碼,即使他很古董,但其中必然有我值得學習的地方,這隻是第一步,後面還有許多坑要去填,幾年下來也確實累積了許多bug,至少曾經還是輝煌過…
當然,會改版的(正決定往Web版調整呢)….
回頭看了看自己的博客,慘(zhi)不(guai)忍(tai)睹(lan),後面還是得多添磚加瓦了