WebBrowser內核指定


一、背景

這幾天在維護公司的一個項目,嗯…到現在七八年沒人動過了(也是老古董了),都說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-位)值]

image

新建的項取名為MyApplication.exe,編輯值時,選擇基數“十進制”,填寫數值數據,這里填寫11000(IE11)

image

最后運行MyAplication.exe,發現問題已經解決

不同IE版本所對應的DWORD值:

image

原文: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),后面還是得多添磚加瓦了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM