当前位置: 首页 > 编程日记 > 正文

构建基于Chromium的应用程序(Winform程序加载Html页面)

chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决定自己开发webcore的分支,叫做Blink引擎,而后google以BSD伯克利许可开源,BSD许可限制较为宽松,很多浏览器都是基于chromium开发的,比如,此后省略100字。google在原有基础上做了进一步的精简优化,并开发出v8 javascript引擎,2010年google收购了webrtc技术随后开放了源代码,webrtc采用vp编码,兼容html5标准,同年google推出了chrome os云操作系统,浏览器的衍生产品。

废话不多说,检索一下Chromium Embedded Framework,简称cef,你可以在cefbuilds上看到当前chromium最新放出的版本,也可以在google code上下载到,里面包括浏览器的核心库和底层api,支持c和c++的编程语言,另外也有第三方的包括.net/mono、java、python、delphi等开源项目。

我们从google code下载win32的c++库,打开release文件夹。

1

这里面作个介绍:

libcef.dll:cef核心库。

icudt.dll:编码格式库。

ffmpegsumo.dll:视频解码器,包含vp8 vp9编码库。

d3dcompiler_43.dll、d3dcompiler_46.dll、libEGL.dll、libGLESv2.dll

这几个是3d图形的库,d3dcompiler_43.dll适用于xp,d3dcompiler_46适用于xp以上版本。

include文件夹里面是cef c++的头文件,可以去github下载.net调用的project,叫做cefsharp,提供了winform和wpf的完整demo。

2

CefSharp:封装是C#调用api的入口和数据接受类。

CefSharp.BrowserSubprocess:是.net写的一个伴随进程,主要负责处理javascript和后台线程。

CefSharp.BrowserSubprocess.Core:是一个c++的工程,需要引用到cef的c++头文件,主要是javascript相关操作。

CefSharp.Core:也是一个c++工程,包括cef的初始化配置、接受事件等。

CefSharp.Example:c#调用cef的初始化配置。

CefSharp.WinForm.Example:写了一个自定义控件,作为cef浏览器的窗口。

ChromimumWebBrowser.cs所有接口的实现可以放在这里面,详见cefsharp demo。

1 public class ChromiumWebBrowser : Control, IWebBrowserInternal, IWinFormsWebBrowser
2 {
3     ...
4 }

再加一个自定义控件BrowserUserControl。自定义一个构造函数。

复制代码
 1 public BrowserUserControl(string url)2 {3     InitializeComponent();4 5     var browser = new ChromiumWebBrowser(url)6     {7         Dock = DockStyle.Fill8     };9     this.Controls.Add(browser);
10 }
复制代码

建立一个Form1启动窗口,添加创建的用户控件。

复制代码
 1 public Form1()2 {3     InitializeComponent();4 5     var browser = new BrowserUserControl(CefExample.DefaultUrl)6     {7         Dock = DockStyle.Fill,8     };9     browser.CreateControl();
10     this.Controls.Add(browser);
11 }
复制代码

再来看一下Program.cs中的main方法入口,CefExample调用了一个Init初始化方法。

复制代码
 1 /// <summary>2 /// The main entry point for the application.3 /// </summary>4 [STAThread]5 static void Main()6 {7     CefExample.Init();8 9     Application.EnableVisualStyles();
10     Application.SetCompatibleTextRenderingDefault(false);
11     Application.Run(new Form1());
12 }
复制代码

在CefSharp.Example工程中,defaulturl就是默认首页url地址。

复制代码
 1 public static class CefExample2 {3     public const string DefaultUrl = "http://www.google.com/";4     private static readonly bool DebuggingSubProcess = Debugger.IsAttached;5 6     public static void Init()7     {8         var settings = new CefSettings();9         settings.RemoteDebuggingPort = 8088;
10         settings.CefCommandLineArgs.Add("enable-media-stream", "enable-media-stream");
11         settings.IgnoreCertificateErrors = true;
12         settings.LogSeverity = LogSeverity.Verbose;
13 
14         if(DebuggingSubProcess)
15         {
16             //var architecture = Environment.Is64BitProcess ? "x64" : "x86";
17             //settings.BrowserSubprocessPath = "..\\..\\..\\..\\CefSharp.BrowserSubprocess\\bin\\" + architecture + "\\Debug\\CefSharp.BrowserSubprocess.exe";
18         }
19 
20         settings.RegisterScheme(new CefCustomScheme
21         {
22             SchemeName = CefSharpSchemeHandlerFactory.SchemeName,
23             SchemeHandlerFactory = new CefSharpSchemeHandlerFactory()
24         });
25 
26         if (!Cef.Initialize(settings))
27         {
28             if (Environment.GetCommandLineArgs().Contains("--type=renderer"))
29             {
30                 Environment.Exit(0);
31             }
32             else
33             {
34                 return;
35             }
36         }
37     }
38 }
复制代码

我们放一个release版本,里面大概有这些文件。locales里面放的本地化资源包,包括cef_100_percent/cef_200_percent,如果删掉,会出现诸如窗口滚动条外观异常等,degug.log会记录操作记录。

11

运行一下打开一个网页。

5

我们再写一个html页面。

复制代码
 1 <!DOCTYPE html>2 3 <html>4 <head>5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">6     <meta id="viewport" name="viewport" content="width=device-width, initial-scale=1">7     <title></title>8 </head>9 <body>
10     <video autoplay></video>
11     <script>
12         'use strict';
13 
14         var video = document.querySelector('video');
15         var constraints = {
16             audio: false,
17             video: true
18         };
19 
20         navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
21           navigator.mozGetUserMedia;
22 
23         function successCallback(stream) {
24             window.stream = stream; 
25             if (window.URL) {
26                 video.src = window.URL.createObjectURL(stream);
27             } else {
28                 video.src = stream;
29             }
30         }
31 
32         function errorCallback(error) {
33             console.log('navigator.getUserMedia error: ', error);
34         }
35 
36         navigator.getUserMedia(constraints, successCallback, errorCallback);
37     </script>
38 </body>
39 </html>
复制代码

修改CefExample的defaulturl指向这个页面。

有一点要注意,在CefCommandLineArgs添加了enable-media-stream参数,意思是开启chrome的媒体流。看下效果。

这里我们基于chromium内核使用到了html5 webrtc技术,页面开启了摄像头。

这里只是粗略的列了个小demo,还有比如一些基本的鼠标事件、页面重定向等功能,除此之外chromium很有功能api值得学习和挖掘。

转载于:https://www.cnblogs.com/fjzhang/p/6867638.html

相关文章:

机器就能绘制这样的作品,你还去写生吗?(续)

本文介绍了利用程序让计算机把输入图像呈现铅笔素描画和彩绘画效果的算法原理。

Apache工具类ToStringBuilder用法简介

ToStringBuilder比较适合在打日志时&#xff0c;输出参数的信息&#xff0c;特别是在参数为对象时&#xff0c;该工具类能够很方便的自动打印对象中的属性值。 package test; /** * * author zhengtian * time 2012-6-28 */ public class User { privat…

自然语言处理:汉语分词

NLPIR/ICTCLAS 汉语分词系统&#xff08;http://ictclas.nlpir.org&#xff09;PyNLPIR 是该汉语分词系统的 python 封装版&#xff08;http://pynlpir.readthedocs.io...&#xff09; 安装步骤&#xff1a;① pip install pynlpir② pynlpir update 官方文档的汉语分词示例&am…

再也不买仙剑正版盘了

奶奶的&#xff0c;好不容易心血来潮买了一回&#xff0c;windows 2003安装上蓝屏&#xff0c;在xp虚拟机上装报错&#xff0c;狗日的大宇&#xff0c;以后专门玩盗版气它 转载于:https://www.cnblogs.com/charie/archive/2008/02/21/1076772.html

利用BP神经网络教计算机进行非线函数拟合(代码部分单层)

单层BP神经网络 本图文已经更新&#xff0c;详细地址如下&#xff1a; http://blog.csdn.net/lsgo_myp/article/details/54425751

ps aux|grep

ps a 显示现行终端机下的所有程序&#xff0c;包括其他用户的程序。 2&#xff09;ps -A 显示所有程序。 3&#xff09;ps c 列出程序时&#xff0c;显示每个程序真正的指令名称&#xff0c;而不包含路径&#xff0c;参数或常驻服务的标示。 4&#xff09;ps -e 此参数的效果…

排序(一)归并、快排、优先队列等(图文具体解释)

排序(一) 0基础排序算法 选择排序 思想&#xff1a;首先&#xff0c;找到数组中最小的那个元素。其次&#xff0c;将它和数组的第一个元素交换位置。再次。在剩下的元素中找到最小的元素。将它与数组的第二个元素交换位置。如此往复&#xff0c;直到将整个数组排序。 【图例】 …

利用BP神经网络教计算机进行非线函数拟合(代码部分多层)

利用BP神经网络教计算机进行非线函数拟合&#xff08;代码部分多层&#xff09; 本图文已经更新&#xff0c;详细地址如下&#xff1a; http://blog.csdn.net/lsgo_myp/article/details/54425751

年年英雄会,岁岁侠客行

虽然今年工作比较忙&#xff0c;但还是坚持参加了CSDN组织的英雄会第二届。如去年所约&#xff0c;CSDN在持续发展着&#xff0c;而英雄会这一中国独特的程序员式的聚会&#xff0c;胜利地举办了第二届。 虽然不能成为MVB&#xff0c;但还是感谢CSDN记得发给我邀请。这份情意还…

Velocity判断空的方法

Velocity中没有null&#xff0c;那么怎么判断null呢 1、在velocity中&#xff0c;非null被认为是真的&#xff0c;所以&#xff0c;可以如下用&#xff1a; #if($!变量名)// 变量不为空的代码 #else// 变量为空的代码 #end

js对Dom操作

<div id"myWebPanelForm"style"width:400;height:200;display:none"><div id"WebPanel_Body"style"width:400;height:200;display:none">测试</div></div><script type"text/javascript">win…

利用BP神经网络教计算机进行非线函数拟合

利用BP神经网络教计算机进行非线函数拟合 本图文已经更新&#xff0c;详细地址如下&#xff1a; http://blog.csdn.net/lsgo_myp/article/details/54425751

phpstorm failed to create jvm:error code -6 解决办法 解决方法

phpStorm 软件打开运行提示 failed to create JVM的解决办法。 修改文件 D:\Program Files (x86)\JetBrains\PhpStorm 7.1.3\bin\PhpStorm.exe.vmoptions 把内存值改成标准值&#xff0c;文件全部内容如下&#xff1a; [plain] view plaincopy -server -Xms128m -Xmx512m -X…

maven jar包冲突常见报错及解决方法

见到如下错误&#xff0c;可以想到是不是jar包冲突 1.java.lang.NoSuchMethodError2.java.lang.ClassNotFoundException3.java.lang.NoClassDefFoundError解决办法 以一个错误为例&#xff1a;解决方法&#xff1a;1.首先定位到具体类。查到org.apache.httpHost对应的maven依赖…

[轉]如果把HTML當成飾品....

轉自:http://blog.onlyone.idv.tw/997.htm [轉]如果把HTML當成飾品.... 如果有一天&#xff0c;有個人把HTML做成耳環掛在耳朵上&#xff0c;那麼… 不過&#xff0c;在國外&#xff0c;就真的有人把這玩意拿出來賣了&#xff01; 在該購物網站的商品說明&#xff0c;還很KUSO這…

利用“栈”解决“出轨”问题

本图文利用“栈”的知识解决了“出轨”问题&#xff01;

a标签点击事件

οnclick"detail(this,${vo.id})" function detail(obj,id){ var lb $("#lb").val(); $(obj).attr("href","${rootUrl }app/wx/recipeOrder/getCoudetail?id"id"&lb"lb); document.location.hrefobj.href; }

maven依赖范围

其中依赖范围scope 用来控制依赖和编译&#xff0c;测试&#xff0c;运行的classpath&#xff08;注意是与classpath&#xff09;的关系. 主要的是三种依赖关系如下&#xff1a; 1.compile&#xff1a; 默认编译依赖范围。对于编译&#xff0c;测试&#xff0c;运行三种classpa…

'or'='or'经典漏洞原理分析

oror漏洞是一个比较老的漏洞了&#xff0c;主要是出现在后台登录上&#xff0c;利用这个漏洞&#xff0c;我们可以不用输入密码就直接进入系统的后台。它出现的原因是在编程时逻辑上考虑不周&#xff0c;同时对单引号没有进行过滤&#xff0c;从而导致了漏洞的出现。先给大家简…

第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)

前言 这部分也许是数据预处理最为关键的一个阶段。 如何对数据降维是一个很有挑战&#xff0c;很有深度的话题&#xff0c;很多理论书本均有详细深入的讲解分析。 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA)&#xff0c;并给出具体的实现步骤。 主成分分析法 - PCA 主…

Matlab编程与数据类型 -- 函数M文件的调用

本图文介绍了Matlab中函数M文件的调用方式。

直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突

直接依赖 在本工程pom文件中配置的依赖&#xff0c;称为本工程的直接依赖。间接依赖 本工程pom配置了依赖A&#xff0c;A又依赖B&#xff0c;则本工程也依赖B&#xff0c;B为本工程的间接依赖。可选依赖 在依赖中配置<optional> true/false 是否向下传递&#xff0c;如果…

Windows 编程[9] - WM_CLOSE 消息

本例效果图:program Project1;usesWindows, Messages;{供 WM_CLOSE 消息调用的自定义过程} procedure OnClose(h: HWND); beginif IDOK MessageBox(h, 确认关闭吗?, 提示, MB_OKCANCEL) thenDestroyWindow(h); end;function WndProc(wnd: HWND; msg: UINT; wParam: Integer; …

Python自动化测试白羊座-week3切片+元组

name zcl,py,zyznames [zcl,py,zyz]print(names[0])print(names[0:2]) #切片就是从里面取几个元素, 从第几个取到第几个结束.取值时顾头不顾尾.print(names[1])#切片操作对字符串也适用name1[zcl,py,zyz]print(name1[2])num list(range(10)) #用range生成列表&#xff0c;需…

Matlab编程与数据类型 -- 函数M文件的组成

本图文介绍了Matlab中函数M文件的组成。

intellij idea 必知的debug功能

1.设置断点 选定要设置断点的代码行&#xff0c;在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子&#xff0c;开始进入调试。 IDE下方出现Debug视图&#xff0c;红色的箭头指向的是现在调试程序停留的代码行&#xff0c;方法f2()中&#xff0c;程…

Lession 15 Good news

1 语法:直接引语;间接引语; 直接引语:用引号"" 直接把要说的话引起来; l am busy, he said. 间接引语:转述说话人的话; He said that he is busy. 间接引语:1>陈述句,say,tell,来转述,人称,时态,指示代词,时间状语,地点状语…

使用HTML5监測站点性能

在这个信息爆炸的互联网时代&#xff0c;越来越多的人缺少了等待的耐心。站点性能对于一个站点来说越来越重要。下面为监控到的站点打开时间对跳出率的影响&#xff1a; 当站点打开时间在0-1秒时&#xff0c;跳出率为12% 当站点打开时间在1-2秒时&#xff0c;跳出率为26% 当站点…

Matlab编程与数据类型 -- 单元数组

Matlab编程与数据类型 – 单元数组

反向代理服务器的工作原理

最近接触了nginx&#xff0c;nginx可以作为一个反向代理服务器完成负载均衡&#xff0c;下面记录一下从网上学习到的一些知识。 一 概述 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受Internet上的连接请求&#xff0c;然后将请求转发给…