WebBrowser內核指定

来源:http://www.cnblogs.com/doscanner/archive/2016/06/23/5611434.html
-Advertisement-
Play Games

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 三個文件夾,第一個是放置前端部分,第二個是各種支持的類文件,第三個是單元測試文件。 Core文件類庫 放置的是與資料庫做交互的文件,以及一些第三方類庫,還有與資料庫連接的文件 1.Lasy.Validator是一個基於Attribute驗證器,我覺得這種驗證方式在挺便捷的,具體可以在這裡查看到htt ...
  • 這些對象都是用來保存信息的,包括用戶信息,傳遞值的信息,全局信息等等。下麵主要說一下他們之間的區別: 1.Application對象 Application用於保存所有用戶的公共的數據信息,如果使用Application對象,一個需要考慮的問題是任何寫操作都要在Application_OnStart ...
  • 引言 HTTP 是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分散式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷地完善和 擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規範化工作正在進行之中,而且HTTP-NG(Next Genera ...
  • 背水一戰 Windows 10 之 綁定: 與 Element 綁定, 與 Indexer 綁定, TargetNullValue - 當綁定數據為 null 時顯示的值, FallbackValue - 當綁定失敗時顯示的值 ...
  • EF和SqlHelper 簡單三層 EF生成sql,再調用ado.net訪問資料庫,最後使結果對象具體化. 之前的SqlHelper 簡單三層的寫法,拼接sql語句字元串,再調用ado.net訪問資料庫,最後也是把結果轉換為對象. 明顯的區別:sql語句的產生,EF是SQL查詢命令和 LINQ 查詢 ...
  • 前言 老規矩,任何技術的入門我通常都會總結增刪改查,本文我就通過HttpWebRequest和SolrNet的方式實現Solr最基礎的增刪改查(CURD)。對於自己的完整項目,同時不想過於依賴第三方類庫的則通過Http介面的方式來調用Solr。 當然也有人喜歡調用第三方的類庫,簡單方便,不需要自己處 ...
  • C#本質論和CLR via C#兩本好書,周老師可能是俗務纏身,太忙了吧,翻譯得只能讓人呵呵了。 你要是忙,別接那麼多活好不啦。 現在都在說供給側改革,都在大力提倡工匠精神,我們做技術的,還是踏實點好,對不啦? 對照一下李建忠老師翻譯的那一版CLR via C#,差距啊。 這裡,僅把隨手發現的幾個問 ...
  • 首先,我們定義一個Student類來測試. 在這樣一個數據中. 我們發現,如果使用自帶的 Distinct ,發現得數據依然是一樣,並沒有想象中的去除重覆。 以下,給出幾個解決方案。 第一種: 繼承EqualityComparer 我們新建一個類。如下。且必須重寫父類中的抽象方法。Equals和Ge ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...