C# 关于浏览器——WebBrowser篇
最近要写一个浏览器包裹一个网站,试了各种浏览器插件,记录一下。
第一个就是微软的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. 什么是 XSS 攻击? (1)概念 (2)攻击类型 2. 如何防御 XSS 攻击? 3. 什么是 CSRF 攻击? (1)概念 (2)攻击类型 4. 如 ...
- python操作本地浏览器webbrowser
python操作本地浏览器webbrowser webbrowser是python3自带的库,可以直接用import webbrowser导入. webbrowser的使用 import webbro ...
- 如何定制一款12306抢票浏览器——完结篇
差不多花了一个星期的业余时间去完成了相关的编码.最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下.其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-oc ...
- python3+selenium4自动化测试操作启动不同的浏览器-基础篇2
通过 WebDrver,Selenium 支持市场上的主要浏览器,但并不是所有的浏览器都能获得官方支持,主要支持的浏览器有Chrome(ium).Firefox. Edge. Internet Exp ...
- GitHub下载加速-浏览器插件篇(一)
GitHub下载加速(浏览器插件) 插件推荐一 (一)chrome 应用商店获取安装 (二)直接(离线)安装 插件一 使用教程 插件推荐二 (一)chrome 应用商店获取安装 (二)直接(离线)安装 ...
- 前端面试之浏览器原理篇
一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击.攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie ...
- 国外 android 手机,Android手机浏览器(国外篇)横向对比评测
第1页:浏览器外观对比(1) 第2页:浏览器外观对比(2) 第3页:浏览器内置地址栏输入对比(1) 第4页:浏览器内置地址栏输入对比(2) 第5页:浏览器性能对比(1) 第6页:浏览器性能对比(2) ...
- 关于图片onload事件兼容性处理, 谷歌浏览器版本 56.0.2896.3 (64-bit) 微信客户端浏览器 canvas篇
关于图片onload事件兼容性处理 阐述: 一个小demo,关于canvas 绘制 大转盘 和 指针,当同时各自添加onload事件指针图片突发性不显示. 兼容性问题-浏览器版本: 谷歌浏览器版本 5 ...
- 浏览器兼容性篇-vue篇-ES6转ES5
在 vue 项目中,ie浏览器识别ES5写法的javascript代码,而IE浏览器不支持,所以需要借助插件 babel-polyfill ,解决方案如下: vue-cli2下 解决浏览器兼容性问题 ...
最新文章
- 《Ext JS权威指南》——2.1节获取Ext JS 4
- SharePoint 2010 Form 认证 之 IIS 添加数据
- # 20155337 2016-2017-2 《Java程序设计》第十周学习总结
- 一加手机怎么导出照片_批处理整理安卓手机微信导出的视频和照片
- NSIS ---使用nsDialogs创建自定义页面,并获取输入到控件中的内容保存到一个XML文档中
- 交互式甘特图控件VARCHART XGantt教程:如何打印和导出图表(.NET版)
- 洛菲创意字体设计分享--绿斗堂字体网
- 南方cass提取坐标生成表格_南方cass方格网角点坐标及高程的识别与导出
- 简易理解设计模式之:组合模式——实现View中的树状结构
- 淘宝校园笔试题鸡蛋与篮子
- c语言解矩阵方程ax=b,用初等变换的方法求解矩阵方程AX=B
- 第二章 SQL命令参考-REASSIGN OWNED
- 电子体温计为什么会说不如水银准,分析了一下,这个锅它不背!!!
- 携职教育:四川2022年人力资源管理师考试报名通知
- C#textbox和label显示皆透明如何修改/让字体和背景透明
- 二. 应用加速(微服务架构设计的cdn访问加速)
- 深入浅出leveldb之基础知识
- Java中单引号和双引号输出的区别
- 【java】String.split方法limit详解
- 博客系统的前端页面设计