zoukankan      html  css  js  c++  java
  • WebBrowser内核指定

    一、背景

    这几天在维护公司的一个项目,嗯…到现在七八年没人动过了(也是老古董了),都说N年前的代码碰不得 处处是坑 不能挖坑还得一步一步的填坑,恰好今天就填了一坑 此处作为记录 供以后翻阅,对代码除了有些看不懂或者说是很凌乱之外,其他都还行(没注释、有注释的地方是自动生成的英文注释…..、包含 各种委托、事件、多线程、用户控件等等)。

    二、问题

    对 就是一个CS程序,其中有个功能是输入网址然后展示网页内容,so问题来了 很多网站不支持IE8以下内核的浏览器(很粗暴的跳转到浏览器下载页面~~)。那为什么不用webkit内核的呢…刚刚也说了这是七八年前的代码了…,用的是WebBrowser WebBrowser WebBrowser,说给换一个吧 时间又不允许 而且…你懂的~~(主要是调整太多),也就只能死马当活马医了。

    三、解决方式

    1.升级IE浏览器

    第一时间 想到的就是升级IE浏览器,说干就干 下载安装最新版IE浏览器…重启…运行程序…输入网址… 很粗暴的跳转到浏览器下载页面~~,看来还是太天真… 原来WebBrowser默认使用IE7内核、只升级浏览器是没用的,需要手动指定

    2.手动指定WebBrowser内核

    浏览了许多资料后,找到了解决方案:改注册表

    在开始菜单内输入“regedit.exe”,进入注册表编辑器

    找到注册表项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    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(@"SOFTWAREMicrosoftInternet ExplorerMAINFeatureControlFEATURE_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();

    然后检查注册表,发现已经修改成功。再次运行程序,发现问题已经解决。

    https://www.cnblogs.com/doscanner/p/5611434.html

  • 相关阅读:
    Owner Useful links
    根据ENumerator 进行数组排序输出(枚举)
    对数组当中内容进行倒叙
    一月十日练习习题,1数组数据存入字典并输出2降序 和倒叙 输出数组中内容3对字符串当中信息进行查找是否存在4 把数组当中信息按照中文排序
    OC中超级无敌排序方法,降序 升序 自定义降序升序
    倒序以及降序输出数组当中的成员信息
    iOS 5 数组转换成字典形式并且排序,然后删除指定字典让中的内容
    基本数据类型的相互转换 int float NSinteger double 的相互转化
    OC字符串相加,结果按照字符串形式输出
    将整形整数转化为数组的形式分别依次存到数组当中,然后倒叙输出、把原本字符串倒序输出。截取字符串等等
  • 原文地址:https://www.cnblogs.com/soundcode/p/10064655.html
Copyright © 2011-2022 走看看