这是一个系列的文章,前面六篇文章的地址如下:
这篇文章和前面六篇文章关系不大,你如果懒得看前面六篇的话,从这一篇开始看也没问题

之前写的六篇文章,都是基于
Xilium.CefGlue开源项目的,
后来又接触过
CefSharp(据说github的客户端也是用这个开发的,但用起来感觉有点蛋疼)
随后又用过
chromiumfx,这个项目虽然用的人没有CefShrp多,但用起来真的很舒心
有时间的话,我再做一下这三个项目的横向对比。

上面三个项目都是基于
CEF的,说实在的
CEF这个项目带有强烈的种族歧视色彩
早在2011年的时候就有国人提到
输入法提示框不能跟随输入光标的问题
并给出了解决方案,请求合并到主干上,但这个项目的负责人,并没有持续跟进这个问题
直到上周一才解决掉这个问题,这期间不知道有多少中、日、韩的开发者在这个问题上纠结
我只能狠狠的说一句“我去年买了个表的!”(当然这是开玩笑的话,我还是尊重开源界所付出的心血和汗水的)
目前CefSharp、CefGlue、chromiumfx都还没有更新,这个问题在这三个项目上依然存在。

另外不得不说一下
nw.js,这是一个国内牛人做的开源项目,我关注了很久了!
nodejs+chromium核心并且还共用V8引擎,对chromium封装的非常好,你几乎挑不出任何毛病

用nw.js开发一个浏览器也不是不可能,但一定要用nodejs就有点蛋疼了,
我曾经给作者
Roger Wang发过邮件,哀求他做一个go语言或C#的封装,
邮件如泥牛入海,再无回音,不过话又说回来人,家是牛人,你又能咋滴!

我们这次要说的是基于chromiumfx开源项目做浏览器应用,言归正传!

环境部署
首先你的
下载chromiumfx的类库,注意,你要记下他的版本号,比如目前最新的版本号是:3.2171.13
其次你要
下载CEF的类库,注意,这里下载的版本号要和前面记下的版本号前两个数字一致,这里就是:3.2171.2069

创建一个winform的工程,运行一下,并在debug目录下创建一个cef的目录:“bin\Debug\cef”
然后把你下载的CEF压缩包解压缩,把release子目录下的东西,都拷贝到
bin\Debug\cef
然后把Resources子目录下的东西也拷贝到
bin\Debug\cef
然后解压缩chromiumfx压缩包,把名称以libcfx开头的文件拷贝到bin\Debug\cef目录
最后这个目录下大概应该有这些内容:

然后让你的工程引用ChromiumWebBrowser.dll和ChromiumFX.dll,
并让这两个DLL拷贝到本地
然后设置你的程序集的属性
“生成”的“目标平台”是x86
“调试”的时候,不能“启用VisualStudio承载进程”

启动和终止Chromium的运行时
先来看代码
Initialize的时候,程序会去你的执行路径下找cef子目录,并加载相关的类库
Shutdown的时候,程序会回收掉
Chromium运行时占用的一些资源;
你也可以通过这种方式来设置一个具体的路径
CfxRuntime.LibCefDirPath = @"C:\path\to\cef\directory";
ChromiumWebBrowser.Initialize();

使用浏览器控件并把他显示在窗体上
就这么三行代码,很简单吧

让浏览页面里的iframe执行JS脚本
先看代码:
var f = wb.GetFrame("mem_index");
var js = File.ReadAllText("login.js", Encoding.UTF8);
f.ExecuteJavaScript(js, "", 0);

好,来解释一下这几行代码

第一行代码
用webbrowser控件获取一个iframe有好几个重载方法
我这里输入的是iframe的name,
还有CfxFrame GetFrame(long identifier);注意这里可不是iframe的id哦
还有一个函数挺有用的
List<string> GetFrameNames();
得到页面中所有iframe的名字
第二行代码就不用解释了
你看到我写了login.js应该知道我不是在做什么好事儿
第三行代码就是让这个iframe执行这段JS脚本
方法的签名是这样的:
void ExecuteJavaScript(string code, string scriptUrl, int startLine);
如果你的iframe已经加载了jquery,那么你执行的代码也是可以使用jqeury的
第二个参数和第三个参数都是和出错调试有关的

浏览器加载状态变更事件
wb.OnLoadingStateChange += wb_OnLoadingStateChange;

void wb_OnLoadingStateChange(object sender, Chromium.Event.CfxOnLoadingStateChangeEventArgs e)
{
            if (e.IsLoading == false)
            {
                 //do what you want
            }
}
加载完成的时候e.IsLoading的值是false

后记
就写到这里,以后再写本系列的第八篇
第八篇的内容将包含:
接管js对话框,并自动触发是或否的按钮
JS和C#通信
给页面或iframe注册全局的回调函数
接管或屏蔽页面的请求


喜欢的人请点推荐,分享知识也不容易,大家快来感谢我 

基于.net开发chrome核心浏览器【七】的更多相关文章

  1. 基于.net开发chrome核心浏览器

    本文转载自:http://www.cnblogs.com/liulun/archive/2013/04/20/3031502.html 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一 ...

  2. 基于.net开发chrome核心浏览器【四】

    原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...

  3. 基于.net开发chrome核心浏览器【二】

    原文:基于.net开发chrome核心浏览器[二] 一: 上一篇的链接: 基于.net开发chrome核心浏览器[一] 二: 相关资源介绍: chrome Frame: 让IE有一颗chrome的心, ...

  4. 基于.net开发chrome核心浏览器【三】

    原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...

  5. 基于.net开发chrome核心浏览器【一】

    原文:基于.net开发chrome核心浏览器[一] 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送IE6浏览器的进程 世界上使用IE6浏览器最多的地方在中国 中国使用IE6 ...

  6. 基于.net开发chrome核心浏览器【五】

    一:本篇将解决的问题 本章主要为了解决一下几个问题: 1.JsDialog的按钮错位的问题 我们开发出的浏览器,在有些操系统上调用alert,confirm之类的对话框时,确定和取消按钮会出现错位的情 ...

  7. 基于.net开发chrome核心浏览器【一】(转)

    http://www.cnblogs.com/liulun/archive/2013/03/18/2874276.html 说明: 这是本系列的第一篇文章,我会尽快发后续的文章. 源起 1.加快葬送I ...

  8. 基于.net开发chrome核心浏览器【六】

    写在前面: 距离发这个系列的上一篇文章已经过去两个多月了 因为工作上不涉及这一部分的内容,兼且琐事缠身,一直无力动笔写这个系列的第六篇文章 然而,有很多朋友都关注这个系列,希望我能再写写. 写文章有人 ...

  9. 黄聪:C# 开发Chrome内核浏览器(WebKit.net)

    WebKit.net是对WebKit的.Net封装,使用它.net程序可以非常方便的集成和使用webkit作为加载网页的容器.这里介绍一下怎么用它来显示一个网页这样的一个最简单的功能. 第一步: 下载 ...

随机推荐

  1. 写个C#命令行参数解析的小工具

    最近测试工作做的比较多因此时常要创建一些控制台类型的应用程序.因为程序有不同的参数开关,需要在程序启动的时候通过命令行来给程序传递各种开关和参数.直接操作args有些不方便,所以就写了个解析参数的小工 ...

  2. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  3. 最短路径之Floyd算法

    Floyd算法又称弗洛伊德算法,也叫做Floyd's algorithm,Roy–Warshall algorithm,Roy–Floyd algorithm, WFI algorithm. Floy ...

  4. 更新整理本人所有博文中提供的代码与工具(Java,2013.11)

    为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载. Java 1.<高效 Java Web 应用开发框架 JessMA v3. ...

  5. JAVAScript柯里化、部分应用参数终极理解

    一.柯里化 在定义柯里化.部分应用参数的概念前,首先必须对闭包有深入的了解和定义,闭包一句话说清楚:函数返回值为函数. 柯里化的定义:将多参函数分解为按步骤接受单个参数的函数,如下代码: var mo ...

  6. Ajax实现简单下拉选项

    基本都是固定步骤!主要在JAVASCRIPT和PHP中的操作 1.HTML代码里就只有两个SELECT标签如下: <select id="province"> < ...

  7. AMD and CMD are dead之KMD.js之懒

    缘由 "懒"在软件设计中,有着重大的意义.最常见的两种"懒",便是: 懒得计算 懒得加载 "懒得计算"常见于服务器端: 比如Multipla ...

  8. 事务隔离级别(IsolationLevel)

    事务的特性(ACID)1.原子性(Atomicity) 事物是数据库的逻辑工作单位,事务中的诸多操作要么全做要么全不做2.一致性(Consistency) 事务执行结果必须是使数据库从一个一致性状态变 ...

  9. arcgis for flex全国地图天气预报的具体实现过程解析

    系统架构是B/S,开发语言是flex,开发工具是myeclise或者flashbuild,通过调用百度提供的在线天气预报web api接口的方式来实现. 采用地图是ArcGIS全国地图,开发接口为ar ...

  10. 在SharePoint中创建可自定义属性的文件夹

    概况 阅读时间:约5分钟 适用版本:SharePoint Server 2010及以上 面向用户:普通用户.管理员.开发人员 难度指数:★★★☆☆ SharePoint中的文件夹分为2种,一种是文档库 ...