2024年4月3日发(作者:)
基于Chromium构建Chrome WebBrowser for .net 控件
我分为了两个项目,一是libfuncs,为了使DLL名称一致,我重命名了CefSharp项目,它负
责提供操作浏览器的方法和触发事件;二是cwber,它是自定义的WinForm控件,用于在
Form上的布局,必须引用。
源码地址:/projects/chromewebbrowse
cwber比较简单,以下是它的代码:
using System;
using c;
using entModel;
using g;
using ;
using ;
using ;
using libfuncs;
namespace cwber
{
public partial class ChromeWebBrowser : UserControl
{
private ChromeApp chrome = null;
ToolTip myToolTip = new ToolTip();
public ChromeWebBrowser()
{
InitializeComponent();
orIllegalCrossThreadCalls = false;
}
private void ChromeWebBrowser_Load(object sender, EventArgs e)
{
if (chrome == null)
{
chrome = new ChromeApp();
}
Start();
}
#region 外部调用方法
ntCompletedEvent elementEvent1;
oadStartEvent elementEvent2;
oadEndEvent elementEvent3;
wnloadingEvent fileDownloading;
wnloadCompletedEvent fileDownloaded;
entInitialized componentInitialized;
pEventListener toolTipEvent;
public void Start()
{
if (chrome != null)
{
= ;
if (componentInitialized == null)
{
componentInitialized = new
entInitialized(componentInitializedEvent);
erEvent(componentInitialized);
}
(chrome);
if (elementEvent1 == null)
{
elementEvent1 = new
ntCompletedEvent(documentComplete);
erEvent(elementEvent1);
}
if (elementEvent2 == null)
{
elementEvent2 = new oadStartEvent(frameStartStart);
erEvent(elementEvent2);
}
if (elementEvent3 == null)
{
elementEvent3 = new oadEndEvent(frameLoadEnd);
erEvent(elementEvent3);
}
if (fileDownloading == null)
{
fileDownloading = new
wnloadingEvent(ading);
erEvent(fileDownloading);
}
if (fileDownloaded == null)
{
fileDownloaded = new
wnloadCompletedEvent(aded);
erEvent(fileDownloaded);
}
if (toolTipEvent == null)
{
toolTipEvent = new
pEventListener(olTipText);
erEvent(toolTipEvent);
}
e = true;
oFront();
}
}
/*
* 描述:释放浏览器
*/
public void Free()
{
elementEvent1 = null;
elementEvent2 = null;
elementEvent3 = null;
fileDownloading = null;
fileDownloaded = null;
componentInitialized = null;
toolTipEvent = null;
e();
chrome = null;
}
/*
* 参数:Url 打开网页地址
* 描述:打开网址。
*/
public void OpenUrl(string Url)
{
if (chrome != null)
(Url);
}
/*
* 参数:id 网页中的控件元素ID
* 描述:根据元素ID获取元素的值,适用于Input,A标签元素
*/
public string GetElementValueById(string id)
{
return chrome == null ? "" : mentValueById(id);
}
/*
* 参数:id 网页中的控件元素ID, value 元素新值
* 描述:为页面中元素赋予新值。
*/
public void SetElementValueById(string id, string value)
{
if (chrome != null)
{
mentValueById(id, value);
}
}
public delegate void TCallBackElementEventListener();
private List
List
/*
* 描述:附加元素的侦听事件。当该元素触发附加事件时,则执行
TCallBackElementEventListener委托方法
*/
public void AppendElementEventListener(string id, string eventName,
TCallBackElementEventListener callFunc)
{
tEventListener elementEvent = new
tEventListener(callFunc);
(elementEvent);
mentEventListener(id, eventName, elementEvent);
}
/*
* 描述:向页面中注入并执行脚本。
*/
public void ExecuteScript(string script)
{
if (chrome != null)
eScript(script);
}
public object EvaluateScript(string script)
{
if (chrome != null)
return teScript(script);
else
return null;
}
/*
* 描述:计算文件单位。用于文件下载。
*/
private string CompareFileSize(Int64 size)
{
//计算K,M单位
string strTotalSize = ;
if (size < 1024)
{
strTotalSize = ng() + " B";
}
else 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?"":s;
}
}
#endregion
#region 事件
/*控件初始化事件*/
public event EventHandler ComponentInitializedEventHandler;
private void componentInitializedEvent()
{
EventArgs e = new EventArgs();
if (ComponentInitializedEventHandler != null)
ComponentInitializedEventHandler(this, e);
}
/*页面加载完成事件*/
public event EventHandler DocumentCompletedEventHandler;
private void documentComplete()
{
EventArgs e = new EventArgs();
if (DocumentCompletedEventHandler != null)
DocumentCompletedEventHandler(this, e);
}
/*Frame加载完成事件,这里的Frame可以是页面本身,也是iFrame元素*/
public event EventHandler PageLoadFinishEventHandler;
private void frameLoadEnd()
{
EventArgs 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 != null)
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();
= "下载中";
= 280;
= 150;
zeBox = false;
zeBox = false;
lBox = false;
osition = Screen;
Label label = new Label();
= 20;
= 50;
= 250;
= "已下载:" + strLoadedSize + "/" + strTotalSize;
(label);
}
();
oFront();
foreach (Control c in ls)
{
if (c is Label)
{
Label label = (Label)c;
= "已下载:" + strLoadedSize + "/" + strTotalSize;
();
}
}
();
}
/*下载完成事件,不开放该事件*/
private void downloaded()
{
if (downloadForm != null)
();
downloadForm = null;
}
/*消息提示事件,不开放*/
private void ShowToolTipText(string text)
{
if (chrome == null) return;
if (OrEmpty(text))
{
All();
return;
}
//保证每行40个字
int len = ;
int offset = 40;
int count = len / offset;
for (int i = 1; i <= count; i++)
{
text = (offset * i, "n");
}
ways = false;
mation = true;
ing = true;
//lTip(button1, text);
Point p = osition;
Point p1 = oClient(p);
(text, chrome, p1.X+20, p1.Y+10);
}
#endregion
}
}
重点是libfuncs中的libfuncs.h、ChromeApp.h、、ClientAdapter.h、
五个文件,实现方法都在里面,其他的文件基本都是接口文件。我自己只
根据项目实际需求来做的功能,接口没有全部实现。
一、 下载与使用
项目包含三个包,分别是:
浏览器核心:libfuncs,主要处理浏览器布局、解释、事件、命令等,源代码使用vs2008编
译;
dotNet桌面控件:cwber,是浏览器在界面载体控件,面向开发者,提供与浏览器交互的
各种函数和事件,源代码使用vs2008编译;
例子:example,描述了如果使用cwber控件,源代码使用vs2010编译,也可以自己重做
例子,我只是为了验证在vs2010下好不好用;
例子中包含了和。
下载地址:/projects/chromewebbrowse/files/
最新版本:
cwber2013.08.08:包含了cwber和example;
cwber2013.08.08.2:包含libfuncs;
二、 Release v1.01
源码地址:/projects/chromewebbrowse/files/
新发的版本中包含了以下函数:
1. 设置语言
SetLanguage
2. 为浏览器设置cookie保存路径
SetCookiePath
3. 全选
SelectAll
4. 复制
Copy
5. 粘贴
Paste
6. 重载
Reload
7. 打印
8. 查看源码
ViewSource
9. 加载Html文本
LoadHtml
10. 注入JS脚本
ExecuteScript
11. 向前
GoForward
12. 回退
GoBack
13. 是否能前进
canGoForward
14. 是否能后退
canGoBack
15. 打开URL地址
OpenUrl
16. 获取元素的值
GetElementValueById
17. 元素赋予新值
SetElementValueById
18. 附加元素的侦听事件。当该元素触发附加事件时,则执行
TCallBackElementEventListener委托方法
AppendElementEventListener
包含的事件:
1. 控件初始化事件
ComponentInitializedEventHandler
2. 页面加载完成事件
DocumentCompletedEventHandler
3. 加载开始事件
PageLoadStartEventHandler
4. 加载完成事件
PageLoadFinishEventHandler
三、 v1.02 增加缓存数据库支持
源码地址:/projects/chromewebbrowse
在1.02版本增加缓存数据库的支持,缓存数据库是使用SQLite。
cwber:增加CacheDB类操作SQLite.
libfunc:增加JsExtendHandler对JS方法的响应。
下面建立html文件来测试,主要内容:
四、 1.0.3发布
源码地址:/projects/chromewebbrowse
感谢众多小伙伴们的关注和支持,我现在建立一个讨论QQ群:343517844,希望大家多提
意见。
在1.0.3版本中针对网友提出的问题进行修改,主要修改内容:
1、增加了JavaScript方法:CallCSharpMethod 在JS中调C#方法。
原形定义:string CallCSharpMethod(string method,string values);
method是C#方法名,values是参数值,如果有多个,则以逗句分隔,如:
CallCSharpMethod("DoThing","untitle,10");
在JS中的应用例子:
将会调Form类中的ShowMessage方法。
2、增加“CSharpBrowserSettings”类,类成员有:
UserAgent 用户代理
CachePath 缓存数据存放路径
Locale 设置语言,如: zh-CN
LocalesDirPath 语言包路径,如"D:ChromeTestBinDebuglocales",一定要是本地存
在的路径。
使用例子请参考ChromeTest程序。
3、 增加事件 “NewWindowEventHandler”
新窗口打开事件,如果创建该事件,则可以编写打开新页面的容器,比如流行的分页
签浏览器,如果没有创建就采用默认的弹出一个窗口。
4.、增加了Title属性,显示当前页面的标题。
5、修改了OpenUrl方法,以前使用这个方法打开的时候会出问题无法打开的Bug,是因为
浏览器控件没有初始化好。
6、增强了例子ChromeTest程序,添加了如下功能:
1). 启动完成后打开首页功能;
2). 增加TabControl,如果新窗口事件,则新创建一个页签并打开新页面;
3).增加“Create page”按钮,创建一个新页签,新页签中打开一个新地址;
4). CSharpBrowserSettings类中参数的使用;
6). 修改了页面,如果设置了CSharpBrowserSettings中的
UserAgent参数,JavaScript中调用ent则显示自定义的参数。
五、 1.1.0.0 发布
大家好,在此版本前推出过1.0.4.0,主要是将内核改为了CefGlue3,Cef版本为
3.1650.1562,其他方法没有什么变化。在以往的版本中,要与网页的交互类基本没有,交
互函数也限于ExecuteScript和EvaluateScript方法,配合javascript方法CallCSharpMethod,
虽然能实现与网页的交互,但对于javascript不太了解的伙伴是太不方便了,在这个新版本
中推出了CwbDocument和CwbElement两个类,CwbDocument包含了所有页面元素和
Cookie内容,CwbElement将映射到网页节点,可以直接读和写,那下面就是这两个类的方
法,不足之处您可以修改,也可以发私信或QQ消息给我。欢迎加入讨论群=>343517844。
更多信息请查看源码包中的用户指南。
源代码下载地址:/projects/chromewebbrowse
类
CwbDocument
属性 Cookies 当前页面所有Cookie
Cookie 当前页面所有Cookie组合成字符串
Root 文档根节点,包含了文档中所有子节点
方法 Load 默认在控件的DocumentCompleted事件中自动调用,也可以手动调用
进行重载。
GetElementsByTagName 根据标签获取所有对应的元素
GetElementById 根据ID获取元素
CwbElement
属性 Id 元素编号
TagName 元素标签名称
IndexPath 元素路径
ChildElements 所有子元素
IsElement 是否元素
IsEditable 是否可编辑
HasChildren 有无子节点
HasAttributes 有无属性
Attributes 节点所有属性集合
InnerText 内文本
InnerHtml 内html文本
Value 元素值
方法 HasAttribute 判断是否有某个属性
GetAttribute 获取属性值
SetAttribute 设置属性值
Click 执行元素点击事件
AttachEventHandler 增加元素事件侦听器


发布评论