记客户端WebBrowser控件修改版本的问题

  • A+
所属分类:.NET技术
摘要

保留在本地电脑的一篇记录,第二条描述是在网上看来的,忘记在哪看的了,也就没注明出处,望见谅。

保留在本地电脑的一篇记录,第二条描述是在网上看来的,忘记在哪看的了,也就没注明出处,望见谅。

1、Winform内置浏览器控件的底层调用与系统IE浏览器的底层调用相同。

2、IE8 对渲染引擎做了很大的改动,新增加一个标准模式 (Standard Mode)。 当用户机器升级到IE8, WebBrowser控件也会随之升级到IE8的渲染引擎。为了保证这些使用WebBrowser控件的应用软件能够工作起来和原来一样,IE8环境下的WebBrowser控件在默认情况下使用了IE7 的渲染模式(也就是IE8中的Compatible View (兼容视图)模式),IE9,IE10,IE11默认情况下同上所述。通过对系统注册表进行修改,可将该控件修改为标准模式渲染(经过本机IE11测试),修改后客户端对注册表的读取写入需要相应的权限。

3、关于构建 Chromium内核浏览器控件的要求;查阅资料后发现存在 CefSharp 项目可实现对Chromium内核控件的支持,但该项目最低需要.NET4.5.2框架的支持。翻查历史版本后,该项目大版本号49为支持NET4.0的最后版,版本差距过大,不建议使用。

4、注册表项添加时需使用完整的进程名,如:chrome.exe。若设置chrome无效。

5、注册表位置记录

记录webBrowser控件使用IE渲染版本的路径:

HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION;

HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION;

记录当前系统IE版本的位置:HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerVersion

当前系统自带IE版本,若存在svcVersion,则此项为升级后的IE版本。

6、添加注册表时IE各版本代码:

switch (IEVersion)             {                 case 7:  //7000 (0x1B58)     IE7                     version = 0x1B58;                     break;                 case 8:  // 8000 (0x1F40)     IE8                     version = 0x1F40;                     break;                 case 9:  //9000 (0×2328)    IE9                     version = 0x2328;                     break;                 case 10: //10000(0×2710)    IE10                     version = 0x2710;                     break;                 case 11: //11000(0×2af8)    IE11                     version =0x2af8;                     break;                 default :                     version = 0x2328;                     break;             }

7、

/*创建时间:  *创建用途:对固定注册表项进行修改,使得WebBrowser控件使用本机IE的标准渲染模式对链接内容进行渲染,  *          而非默认的 兼容模式。  *          本文件获取IE版本出错时,会将注册表项默认设置为IE9对应的值,原因为IE9为win7自带版本。  */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32; using System.Windows.Forms; using System.Diagnostics;  namespace XXXXXX {     class SetIEVersionByRegedit     {         //private bool is64BitSystem = false;          const string DEFAULT_IE_VERSION = "9.0";          const string COMMON_PATH_FRONT = @"SOFTWARE";          const string DIFF_BETWEEN_32_AND_64 = @"Wow6432Node";          const string COMMON_PATH_BEHIND = @"MicrosoftInternet ExplorerMAINFeatureControlFEATURE_BROWSER_EMULATION";          //舍弃以下内容,注册表两项全部写入         //private int GetBitOperatingSystem ()         //{                     //    return Environment.Is64BitOperatingSystem ? 64 : 32;         //}          //private string GetSettingPath ()         //{         //    int systemBit = GetBitOperatingSystem();         //    if (systemBit == 32)         //    {         //        return new StringBuilder().Append(COMMON_PATH_FRONT).         //    }         //}          public void SetRegistry()         {             int IEVersion = GetIEVersion();             string itemName = GetItemNameNeedCreat();             uint itemValue = GetItemValueNeedCreat(IEVersion);             string path32Key = COMMON_PATH_FRONT + COMMON_PATH_BEHIND;             string path64Key = COMMON_PATH_FRONT + DIFF_BETWEEN_32_AND_64 + COMMON_PATH_BEHIND;             WriteToRegistry(path32Key, itemName, itemValue);             WriteToRegistry(path64Key, itemName, itemValue);         }          #region 获取IE版本         private int GetIEVersion ()         {             string version = "9";             try             {                 version = GetIEVersionByWebControl();             }             catch             {                 version = GetIEVersionByRegistry();             }                         return Convert.ToInt32(version);         }           /// <summary>         /// 通过注册表获取IE版本,默认返回9         /// </summary>         /// <returns></returns>         private string GetIEVersionByRegistry ()         {             string version = "9.0";//win7自带             try             {                 RegistryKey ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftInternet Explorer");                 if(ieKey == null)                 {                     return version;                 }                 version = ieKey.GetValue("Version").ToString();                 //本机IE升级则存在此项                 if (ieKey.GetValue("svcVersion") != null)                 {                     version = ieKey.GetValue("svcVersion").ToString();                 }             }             catch { }              return version.Substring(0, version.IndexOf("."));                                          }          private string GetIEVersionByWebControl ()         {             string version = (new WebBrowser()).Version.Major.ToString();             return version;         }         #endregion         //         private uint GetItemValueNeedCreat (int IEVersion)         {             uint version = 0x2328;             switch (IEVersion)             {                 case 7:  //7000 (0x1B58)     IE7                     version = 0x1B58;                     break;                 case 8:  // 8000 (0x1F40)     IE8                     version = 0x1F40;                     break;                 case 9:  //9000 (0×2328)    IE9                     version = 0x2328;                     break;                 case 10: //10000(0×2710)    IE10                     version = 0x2710;                     break;                 case 11: //11000(0×2af8)    IE11                     version =0x2af8;                     break;                 default :                     version = 0x2328;                     break;             }             return version;         }          private string GetItemNameNeedCreat ()         {             string keyName = "XXXXX.exe";             try             {                 keyName = GetCurrentProessName();             }             catch { }              return keyName;         }                  private string GetCurrentProessName ()         {             var process = Process.GetCurrentProcess();             string ProcessModuleName = Process.GetCurrentProcess().MainModule.ModuleName;             return ProcessModuleName;         }                private void WriteToRegistry(string keyName,string itemName,object itemValue)         {             try             {                 if (IsExistSetting( keyName, itemName, itemValue)) { return; }                 RegistryKey root = Registry.LocalMachine;                 RegistryKey key = root.OpenSubKey(keyName, true);                 key.SetValue(itemName, itemValue, RegistryValueKind.DWord);             }             catch (Exception ex) //设置出错则使用客户电脑设置             {             }                     }          private bool IsExistSetting (string keyName, string itemName, object itemValue)         {             RegistryKey root = Registry.LocalMachine;             RegistryKey key = root.OpenSubKey(keyName, true);             if(key == null)             {                 return false;             }             return key.GetValue(itemName,string.Empty).ToString() == itemValue.ToString();         }           } }