最近要写一个浏览器包裹一个网站,试了各种浏览器插件,记录一下。

第一个就是微软的WebBrowser,这个很容易,直接拖过来,然后写一下注册表调用IE11的内核显示,这个代码是抄的:

/// <summary>/// 修改注册表信息来兼容当前程序////// </summary>  static void SetWebBrowserFeatures(int ieVersion){// don't change the registry if running in-proc inside Visual Studio  if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)return;//获取程序及名称  var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);            //得到浏览器的模式的值  UInt32 ieMode = GeoEmulationModee(ieVersion);var featureControlRegKey = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\";//设置浏览器对应用程序(appName)以什么模式(ieMode)运行Registry.SetValue(featureControlRegKey + "FEATURE_BROWSER_EMULATION",appName, ieMode, RegistryValueKind.DWord);//为完整的Internet Explorer浏览器启用“打开”的功能         Registry.SetValue(featureControlRegKey + "FEATURE_ENABLE_CLIPCHILDREN_OPTIMIZATION",appName, 1, RegistryValueKind.DWord);Registry.SetValue(featureControlRegKey + "FEATURE_AJAX_CONNECTIONEVENTS",appName, 1, RegistryValueKind.DWord);Registry.SetValue(featureControlRegKey + "FEATURE_GPU_RENDERING",appName, 1, RegistryValueKind.DWord);Registry.SetValue(featureControlRegKey + "FEATURE_WEBOC_DOCUMENT_ZOOM",appName, 1, RegistryValueKind.DWord);Registry.SetValue(featureControlRegKey + "FEATURE_NINPUT_LEGACYMODE",appName, 0, RegistryValueKind.DWord);}/// <summary>  /// 获取浏览器的版本  /// </summary>  /// <returns></returns>  static int GetBrowserVersion(){int browserVersion = 0;using (var ieKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer",RegistryKeyPermissionCheck.ReadSubTree,System.Security.AccessControl.RegistryRights.QueryValues)){var version = ieKey.GetValue("svcVersion");if (null == version){version = ieKey.GetValue("Version");if (null == version)throw new ApplicationException("Microsoft Internet Explorer is required!");}int.TryParse(version.ToString().Split('.')[0], out browserVersion);}//如果小于7  if (browserVersion < 7){throw new ApplicationException("不支持的浏览器版本!");}return browserVersion;}/// <summary>  /// 通过版本得到浏览器模式的值/// </summary>  /// <param name="browserVersion"></param>  /// <returns></returns>  static UInt32 GeoEmulationModee(int browserVersion){UInt32 mode = 11000; // Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed in IE11 Standards mode.   switch (browserVersion){case 7:mode = 7000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE7 Standards mode.   break;case 8:mode = 8000; // Webpages containing standards-based !DOCTYPE directives are displayed in IE8 mode.   break;case 9:mode = 9000; // Internet Explorer 9. Webpages containing standards-based !DOCTYPE directives are displayed in IE9 mode.                      break;case 10:mode = 10000; // Internet Explorer 10.  break;case 11:mode = 11000; // Internet Explorer 11  break;}return mode;}

然后在Form的Load里面写:

SetWebBrowserFeatures(11);//内核为11

就OK了,然后就是处理新窗口的问题了,这个有两种情况,一个是网页内容的新窗口,主要是target的处理,添加事件处理函数:

/防止在新窗口打开链接private void browser_NewWindow(object sender, CancelEventArgs e){e.Cancel = true;}//替换掉网页中链接的新窗口属性private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){//this.Text = this.browser.Document.Title;foreach (HtmlElement links in this.browser.Document.Links){links.SetAttribute("target", "_self");}foreach (HtmlElement form in this.browser.Document.Forms){form.SetAttribute("target", "_self");}}

还有一种是js的window.open,这个这样处理:在Form_Load里面写

 string jsHtml= "window.open=function(url, title, prop){window.external.jumpUrl(url);}";
mshtml.IHTMLDocument2 doc = browser.Document.DomDocument as mshtml.IHTMLDocument2;mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2;win.execScript(jsHtml, "javascript");

需要引用Microsoft.mshtml,其中jumpUrl是程序自身的一个函数,处理传递过来的 Url,通常是直接load一下:

public void jumpUrl(string url){            browser.Navigate(url);}

要从js里面调用函数,需要引用:

using System.Runtime.InteropServices;

然后在类前面写:

[System.Runtime.InteropServices.ComVisible(true)]
    public partial class mainForm : Form
    {

.......

然后就是各种加载导航操作什么的,这个没什么好说的。

一些坑:

1、这个对js的支持非常弱,尤其是用了jquery的操作,不确定性太多;

2、虽然用了IE内核,但并不是全部支持IE的功能,感觉也就是60~70的样子;

3、对客户机的环境依赖太多,需要装IE的高版本,FrameWorks、VS支持什么的。

总之,不推荐包装复杂的站点,否则就是噩梦。

C# 关于浏览器——WebBrowser篇相关推荐

  1. 前端面试题之浏览器原理篇

    前端面试题之浏览器原理篇 一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 (2)攻击类型 2. 如何防御 XSS 攻击? 3. 什么是 CSRF 攻击? (1)概念 (2)攻击类型 4. 如 ...

  2. python操作本地浏览器webbrowser

    python操作本地浏览器webbrowser webbrowser是python3自带的库,可以直接用import webbrowser导入. webbrowser的使用 import webbro ...

  3. 如何定制一款12306抢票浏览器——完结篇

    差不多花了一个星期的业余时间去完成了相关的编码.最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下.其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-oc ...

  4. python3+selenium4自动化测试操作启动不同的浏览器-基础篇2

    通过 WebDrver,Selenium 支持市场上的主要浏览器,但并不是所有的浏览器都能获得官方支持,主要支持的浏览器有Chrome(ium).Firefox. Edge. Internet Exp ...

  5. GitHub下载加速-浏览器插件篇(一)

    GitHub下载加速(浏览器插件) 插件推荐一 (一)chrome 应用商店获取安装 (二)直接(离线)安装 插件一 使用教程 插件推荐二 (一)chrome 应用商店获取安装 (二)直接(离线)安装 ...

  6. 前端面试之浏览器原理篇

    一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击.攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie ...

  7. 国外 android 手机,Android手机浏览器(国外篇)横向对比评测

    第1页:浏览器外观对比(1) 第2页:浏览器外观对比(2) 第3页:浏览器内置地址栏输入对比(1) 第4页:浏览器内置地址栏输入对比(2) 第5页:浏览器性能对比(1) 第6页:浏览器性能对比(2) ...

  8. 关于图片onload事件兼容性处理, 谷歌浏览器版本 56.0.2896.3 (64-bit) 微信客户端浏览器 canvas篇

    关于图片onload事件兼容性处理 阐述: 一个小demo,关于canvas 绘制 大转盘 和 指针,当同时各自添加onload事件指针图片突发性不显示. 兼容性问题-浏览器版本: 谷歌浏览器版本 5 ...

  9. 浏览器兼容性篇-vue篇-ES6转ES5

    在 vue 项目中,ie浏览器识别ES5写法的javascript代码,而IE浏览器不支持,所以需要借助插件 babel-polyfill ,解决方案如下: vue-cli2下 解决浏览器兼容性问题 ...

最新文章

  1. 《Ext JS权威指南》——2.1节获取Ext JS 4
  2. SharePoint 2010 Form 认证 之 IIS 添加数据
  3. # 20155337 2016-2017-2 《Java程序设计》第十周学习总结
  4. 一加手机怎么导出照片_批处理整理安卓手机微信导出的视频和照片
  5. NSIS ---使用nsDialogs创建自定义页面,并获取输入到控件中的内容保存到一个XML文档中
  6. 交互式甘特图控件VARCHART XGantt教程:如何打印和导出图表(.NET版)
  7. 洛菲创意字体设计分享--绿斗堂字体网
  8. 南方cass提取坐标生成表格_南方cass方格网角点坐标及高程的识别与导出
  9. 简易理解设计模式之:组合模式——实现View中的树状结构
  10. 淘宝校园笔试题鸡蛋与篮子
  11. c语言解矩阵方程ax=b,用初等变换的方法求解矩阵方程AX=B
  12. 第二章 SQL命令参考-REASSIGN OWNED
  13. 电子体温计为什么会说不如水银准,分析了一下,这个锅它不背!!!
  14. 携职教育:四川2022年人力资源管理师考试报名通知
  15. C#textbox和label显示皆透明如何修改/让字体和背景透明
  16. 二. 应用加速(微服务架构设计的cdn访问加速)
  17. 深入浅出leveldb之基础知识
  18. Java中单引号和双引号输出的区别
  19. 【java】String.split方法limit详解
  20. 博客系统的前端页面设计

热门文章

  1. Java使用poi根据word模板进行导出(有效可行)
  2. Scala学习笔记-详细记录学习中遇到的知识点
  3. 虚拟机由于电脑未正常关机打不开问题-两种情况
  4. 2种特殊电容:X电容和Y电容,你了解多少?
  5. SONiC架构DOCKER组件交互分析
  6. 我的第一台电脑【活动】
  7. 【深度学习】常用的模型评估指标
  8. 美护品牌inFace获中国品牌经济峰会2021年度最具价值投资项目
  9. Ubuntu12.04 屏幕闪烁
  10. 牧牛商学院,区块链推进经济社会相关领域规则体系重构