zoukankan      html  css  js  c++  java
  • 基于.net开发chrome核心浏览器【七】

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

    之前写的六篇文章,都是基于 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的目录:“binDebugcef”
    然后把你下载的CEF压缩包解压缩,把release子目录下的东西,都拷贝到 binDebugcef
    然后把Resources子目录下的东西也拷贝到 binDebugcef
    然后解压缩chromiumfx压缩包,把名称以libcfx开头的文件拷贝到binDebugcef目录
    最后这个目录下大概应该有这些内容:

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

    启动和终止Chromium的运行时
    先来看代码
    Initialize的时候,程序会去你的执行路径下找cef子目录,并加载相关的类库
    Shutdown的时候,程序会回收掉 Chromium运行时占用的一些资源;
    你也可以通过这种方式来设置一个具体的路径
    CfxRuntime.LibCefDirPath = @"C:path ocefdirectory";
    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注册全局的回调函数
    接管或屏蔽页面的请求


    喜欢的人请点推荐,分享知识也不容易,大家快来感谢我 
  • 相关阅读:
    数据库事务的四大特性以及事务的隔离级别
    数据库事务
    Java 反射机制(包括组成、结构、示例说明等内容)
    Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
    一分钟教你知道乐观锁和悲观锁的区别
    vue-router的history模式发布配置
    asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档
    ubuntu下查看-卸载软件(卸载.net core sdk的方法)
    ubuntu终端执行shell脚本报command not found解决方法
    sqlserver 重置标识列
  • 原文地址:https://www.cnblogs.com/liulun/p/4470577.html
Copyright © 2011-2022 走看看