1、ChromiumWebBrowser基于Chromium构建Chrome WebBrowser for .net 控件我分为了两个项目,一是libfuncs,为了使DLL名称一致,我重命名了CefSharp项目,它负责提供操作浏览器的方法和触发事件;二是cwber,它是自定义的WinForm控件,用于在Form上的布局,必须引用libfuncs.dll。源码地址:cwber比较简单,以下是它的代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;usin
2、g System.Data;using System.Text;using System.Windows.Forms;using libfuncs;namespace cwber public partial class ChromeWebBrowser : UserControl private ChromeApp chrome = null; ToolTip myToolTip = new ToolTip(); public ChromeWebBrowser() InitializeComponent(); ChromeWebBrowser.CheckForIllegalCrossThre
3、adCalls = false; private void ChromeWebBrowser_Load(object sender, EventArgs e) if (chrome = null) chrome = new ChromeApp(); Start(); #region 外部调用方法 libfuncs.DocumentCompletedEvent elementEvent1; libfuncs.FrameLoadStartEvent elementEvent2; libfuncs.FrameLoadEndEvent elementEvent3; libfuncs.FileDownl
4、oadingEvent fileDownloading; libfuncs.FileDownloadCompletedEvent fileDownloaded; libfuncs.ComponentInitialized componentInitialized; libfuncs.ToolTipEventListener toolTipEvent; public void Start() if (chrome != null) chrome.Dock = DockStyle.Fill; if (componentInitialized = null) componentInitialized
5、 = new libfuncs.ComponentInitialized(componentInitializedEvent); chrome.RegisterEvent(componentInitialized); Controls.Add(chrome); if (elementEvent1 = null) elementEvent1 = new libfuncs.DocumentCompletedEvent(documentComplete); chrome.RegisterEvent(elementEvent1); if (elementEvent2 = null) elementEv
6、ent2 = new libfuncs.FrameLoadStartEvent(frameStartStart); chrome.RegisterEvent(elementEvent2); if (elementEvent3 = null) elementEvent3 = new libfuncs.FrameLoadEndEvent(frameLoadEnd); chrome.RegisterEvent(elementEvent3); if (fileDownloading = null) fileDownloading = new libfuncs.FileDownloadingEvent(
7、this.downloading); chrome.RegisterEvent(fileDownloading); if (fileDownloaded = null) fileDownloaded = new libfuncs.FileDownloadCompletedEvent(this.downloaded); chrome.RegisterEvent(fileDownloaded); if (toolTipEvent = null) toolTipEvent = new libfuncs.ToolTipEventListener(this.ShowToolTipText); chrom
8、e.RegisterEvent(toolTipEvent); chrome.Visible = true; chrome.BringToFront(); /* * 描述:释放浏览器 */ public void Free() elementEvent1 = null; elementEvent2 = null; elementEvent3 = null; fileDownloading = null; fileDownloaded = null; componentInitialized = null; toolTipEvent = null; chrome.Dispose(); chrome
9、 = null; /* * 参数:Url 打开网页地址 * 描述:打开网址。 */ public void OpenUrl(string Url) if (chrome != null) chrome.Load(Url); /* * 参数:id 网页中的控件元素ID * 描述:根据元素ID获取元素的值,适用于Input,A标签元素 */ public string GetElementValueById(string id) return chrome = null ? : chrome.GetElementValueById(id); /* * 参数:id 网页中的控件元素ID, value
10、 元素新值 * 描述:为页面中元素赋予新值。 */ public void SetElementValueById(string id, string value) if (chrome != null) chrome.SetElementValueById(id, value); public delegate void TCallBackElementEventListener(); private List elementEventList = new List(); /* * 描述:附加元素的侦听事件。当该元素触发附加事件时,则执行TCallBackElementEventListen
11、er委托方法 */ public void AppendElementEventListener(string id, string eventName, TCallBackElementEventListener callFunc) libfuncs.ElementEventListener elementEvent = new libfuncs.ElementEventListener(callFunc); elementEventList.Add(elementEvent); chrome.AddElementEventListener(id, eventName, elementEve
12、nt); /* * 描述:向页面中注入并执行脚本。 */ public void ExecuteScript(string script) if (chrome != null) chrome.ExecuteScript(script); public object EvaluateScript(string script) if (chrome != null) return chrome.EvaluateScript(script); else return null; /* * 描述:计算文件单位。用于文件下载。 */ private string CompareFileSize(Int
13、64 size) /计算K,M单位 string strTotalSize = string.Empty; if (size = 1024 & size 1024 * 1024) strTotalSize = (size / 1024).ToString() + KB; else strTotalSize = (size / 1024 / 1024).ToString() + MB; return strTotalSize; #endregion #region 属性 public string Url get return chrome = null?:chrome.Core.Address
14、; #endregion #region 事件 /*控件初始化事件*/ public event EventHandler ComponentInitializedEventHandler; private void componentInitializedEvent() EventArgs e = new EventArgs(); if (ComponentInitializedEventHandler != null) ComponentInitializedEventHandler(this, e); /*页面加载完成事件*/ public event EventHandler Docu
15、mentCompletedEventHandler; private void documentComplete() EventArgs e = new EventArgs(); if (DocumentCompletedEventHandler != null) DocumentCompletedEventHandler(this, e); /*Frame加载完成事件,这里的Frame可以是页面本身,也是iFrame元素*/ public event EventHandler PageLoadFinishEventHandler; private void frameLoadEnd() Ev
16、entArgs e = new EventArgs(); if (PageLoadFinishEventHandler != null) PageLoadFinishEventHandler(this, e); /*Frame加载开始事件,这里的Frame可以是页面本身,也是iFrame元素*/ public event EventHandler PageLoadStartEventHandler; private void frameStartStart() EventArgs e = new EventArgs(); if (PageLoadStartEventHandler != nul
17、l) PageLoadStartEventHandler(this, e); /*下载中事件,不开放该事件*/ Form downloadForm = null; private void downloading(Int64 totalSize, Int64 loadedSize) string strTotalSize = CompareFileSize(totalSize); string strLoadedSize = CompareFileSize(loadedSize); if (downloadForm = null) downloadForm = new Form(); down
18、loadForm.Text = 下载中; downloadForm.Width = 280; downloadForm.Height = 150; downloadForm.MaximizeBox = false; downloadForm.MinimizeBox = false; downloadForm.ControlBox = false; downloadForm.StartPosition = FormStartPosition.CenterScreen; Label label = new Label(); label.Left = 20; label.Top = 50; labe
19、l.Width = 250; label.Text = 已下载: + strLoadedSize + / + strTotalSize; downloadForm.Controls.Add(label); downloadForm.Show(); downloadForm.BringToFront(); foreach (Control c in downloadForm.Controls) if (c is Label) Label label = (Label)c; label.Text = 已下载: + strLoadedSize + / + strTotalSize; label.Up
20、date(); downloadForm.Update(); /*下载完成事件,不开放该事件*/ private void downloaded() if (downloadForm != null) downloadForm.Close(); downloadForm = null; /*消息提示事件,不开放*/ private void ShowToolTipText(string text) if (chrome = null) return; if (string.IsNullOrEmpty(text) myToolTip.RemoveAll(); return; /保证每行40个字
21、int len = text.Length; int offset = 40; int count = len / offset; for (int i = 1; i = count; i+) text = text.Insert(offset * i, n); myToolTip.ShowAlways = false; myToolTip.UseAnimation = true; myToolTip.UseFading = true; /t.SetToolTip(button1, text); Point p = Control.MousePosition; Point p1 = this.
22、PointToClient(p); myToolTip.Show(text, chrome, p1.X+20, p1.Y+10); #endregion 重点是libfuncs中的libfuncs.h、ChromeApp.h、ChromeApp.cpp、ClientAdapter.h、ClientAdapter.cpp五个文件,实现方法都在里面,其他的文件基本都是接口文件。我自己只根据项目实际需求来做的功能,接口没有全部实现。一、ChromeWebBrowser.Net 下载与使用ChromeWebBrowser.Net项目包含三个包,分别是:浏览器核心:libfuncs,主要处理浏览器布局、
23、解释、事件、命令等,源代码使用vs2008编译;dotNet桌面控件:cwber,是浏览器在界面载体控件,面向开发者,提供与浏览器交互的各种函数和事件,源代码使用vs2008编译;例子:example,描述了如果使用cwber控件,源代码使用vs2010编译,也可以自己重做例子,我只是为了验证在vs2010下好不好用;例子中包含了cwber.dll和libfuncs.dll。下载地址:最新版本:cwber2013.08.08:包含了cwber和example;cwber2013.08.08.2:包含libfuncs;二、ChromeWebB Release v1.01源码地址:新发的版本中包含
24、了以下函数:1. 设置语言 SetLanguage2. 为浏览器设置cookie保存路径 SetCookiePath3. 全选 SelectAll4. 复制 Copy5. 粘贴 Paste6. 重载 Reload7. 打印 Print8. 查看源码 ViewSource9. 加载Html文本 LoadHtml10. 注入JS脚本 ExecuteScript11. 向前 GoForward12. 回退 GoBack13. 是否能前进 canGoForward14. 是否能后退 canGoBack15. 打开URL地址 OpenUrl16. 获取元素的值 GetElementValueById17
25、. 元素赋予新值 SetElementValueById18. 附加元素的侦听事件。当该元素触发附加事件时,则执行TCallBackElementEventListener委托方法 AppendElementEventListener包含的事件:1. 控件初始化事件 ComponentInitializedEventHandler2. 页面加载完成事件 DocumentCompletedEventHandler3. 加载开始事件 PageLoadStartEventHandler4. 加载完成事件 PageLoadFinishEventHandler三、ChromeWebB v1.02 增加缓
26、存数据库支持源码地址:在1.02版本增加缓存数据库的支持,缓存数据库是使用SQLite。cwber:增加CacheDB类操作SQLite.libfunc:增加JsExtendHandler对JS方法的响应。下面建立html文件来测试,主要内容:function myclick() alert(cachedb.Connect(testdb);function myexecute() cachedb.Execute(create table mytable(column1 int,column2 int); cachedb.Execute(insert into mytable values(1,
27、2); cachedb.Execute(insert into mytable values(2,3); cachedb.Execute(insert into mytable values(3,4);function myquery() var res = cachedb.Query(select * from mytable); alert(res); var item = JSON.parse(res); alert(item.rows0.column1);function myclose()cachedb.Close();四、ChromeWebB 1.0.3发布源码地址:感谢众多小伙伴们的关注和支持,我现在建立一个讨论QQ群:343517844,希望大家多提意见。在1.0.3版本中针对网友提出的问题进行修改,主要修改内容:1、增加了JavaScript方法:CallCSharpMethod 在JS中调C#方法。原形定义:string CallCSharpMethod(s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1