【转】C#开发Chrome内核浏览器(WebKit)
WebKit是对WebKit的.Net封装,使⽤它程序可以⾮常⽅便的集成和使⽤webkit作为加载⽹页的容器。这⾥介绍⼀下怎么⽤它来显⽰⼀个⽹页这样的⼀个最简单的功能。
第⼀步:
下载WebKit 的bin⽂件。别⼩看这⼀步,你不⼀定能下载成功,原因你懂的。
第⼆步:
新建⼀个WindowsForms⼯程。
然后把下载好的webkit bin⽬录下的所有⽂件复制到新建⼯程的bin/Debug/⽬录下。
添加引⽤,通过浏览添加对“WebKitBrowser.dll”的引⽤。
第三步:
来写写代码了。双击Form1的窗体进⼊代码,写下这⼏⾏代码:
private void Form1_Load(object sender, EventArgs e)
{
WebKit.WebKitBrowser browser = new WebKitBrowser();
browser.Dock = DockStyle.Fill;
this.Controls.Add(browser);
browser.Navigate("");
}
运⾏看看效果:
与IE内核的WebBrowser对⽐:
⾮常简单的三步就完成了。可是话说回来了,时下都流⾏⼀步到位的,例如使⽤System.Windows.Forms.WebBrowser 。
使⽤.Net框架⾃带的,调⽤IE内核的WebBrowser来显⽰⽹页也许更简单些,只需要在新建的⼯程中写下这么⼏⾏代码便可:
private void Form1_Load(object sender, EventArgs e)
{
WebBrowser browser = new WebBrowser();
browser.Dock = DockStyle.Fill;
this.Controls.Add(browser);
browser.Navigate("");
}
运⾏起来的效果看起来差不多,⾁眼基本只能看出字体稍微不同⽽已:
既然都差不多,那为什么还不厌其烦的去下载⼏个M的dll来显⽰⽹页呢?这是因为如果使⽤IE内核的WebBrowser我们⽆法预知对⽹页的显⽰效果,例如你的电脑是xp,可能会调⽤ie6作为加载器,如果是win7,可能会调⽤ie8作为加载器,⽽他们的显⽰效果是不完全⼀样的。下⾯⽤⼀个例⼦来看看。
private void Form1_Load(object sender, EventArgs e)
{
WebBrowser browser = new WebBrowser();
browser.Dock = DockStyle.Fill;
browser.Navigate("q/doraemon/doraemon_css3.html");
splitContainer1.Panel1.Controls.Add(browser);
WebKit.WebKitBrowser kitBrowser = new WebKitBrowser();
kitBrowser.Dock = DockStyle.Fill;
kitBrowser.Navigate("q/doraemon/doraemon_css3.html");
splitContainer1.Panel2.Controls.Add(kitBrowser);
}
效果图如下:
本机的系统是win7+IE9,但是通过WebBrowser调⽤,估计仍然使⽤的是IE8内核,所以显⽰效果很差。
通过这样左右对⽐,可以看出多了⼀步⿇烦,是有必要的。
/***********************************************************************/
问:下载了⼀个第三⽅的内核浏览器插件webkit(版本是2011),调⽤⽹页中的js函数报错:对 COM 组件的调⽤返回了错误 HRESULT E_FAIL,不知道是因为缺少⽂件还是其他原因?webkit插件怎么调⽤⽹页上的js函数呢?拜托各位
答:花费了⼀些时间算是解决了总结⼀下结论,⽅便他⼈。
webkit调⽤js函数:
//webKitBrowser1.DocumentText =
// "<html><head><title>Test Page</title></head><body>" +
// "<p id=\"testelement\" style=\"color: red\">Hello, World!</p>" +
// "<div><p>A</p><p>B</p><p>C</p></div>" +
// "<script type=\"text/javascript\">" +
// "function f() { window.open('le', 'myWindow'); }</script>" +
// "</body></html>";
webKitBrowser1.IsScriptingEnabled = true;//启⽤js函数调⽤
string str = webKitBrowser1.StringByEvaluatingJavaScriptFromString("Test()");//参数跟webbrowser有点不⼀样,⽅法名加括号,测试时不要直接alert,好像没显⽰出来
两句代码,js函数定义到需要调⽤的⽹页⾥⾯,或者直接嵌⼊⼀段js也可以,⽐如上⾯注释的部分。
/**********************************************************************************/
有个项⽬要使⽤WebBroswer控件,并且要能传递⼀个js对象供前台调⽤,⽤c#的WebBroswer控件很容易实现:
[csharp]
1. private void Form1_Load(object sender, EventArgs e)
2. {
3.    WebBrowser wb = new WebBrowser();
4.    wb.ObjectForScripting = new myClass();
5. }
[csharp]
1. private void Form1_Load(object sender, EventArgs e)
2. {
3.    WebBrowser wb = new WebBrowser();
4.    wb.ObjectForScripting = new myClass();
5. }
要传递的js对象必须使⽤[ComVisibleAttribute]标记为COM 可见:
[csharp]
1. [System.Runtime.InteropServices.ComVisibleAttribute(true)]
2. class myClass
3. {
4.    public void Test()
5.    {
6.        System.Windows.Forms.MessageBox.Show("alert:Test");
7.    }
8. }
[csharp]
1. [System.Runtime.InteropServices.ComVisibleAttribute(true)]
2. class myClass
3. {
4.    public void Test()
5.    {
6.        System.Windows.Forms.MessageBox.Show("alert:Test");
7.    }
8. }
这样前台就能使⽤al调⽤myClass的⽅法: al.Test();
如果就这样那就简单了 ,可偏偏项⽬使⽤的⽹站对IE的兼容性极差(吐槽下:个⼈觉得是IE太烂了,对标准的⽀持太差),⽆奈之下想寻其他类似的WebBrowser控件,发现⼏个不错的替换控件:
1. GeokoFx:⼀个Firefox的Geoko引擎的Windows Forms包装,google上的下载地址:官⽹:
2. WebKit.NET:webkit的.NET封装,下载地址:
本来决定使⽤GeokoFx,因为项⽬使⽤的⽹站⽤⽕狐打开是很快的,但是我了⼏天资料也没发现怎么传递个js对象给控件,当发现Qt的webbroswer 控件也是封装的WebKit控件时,遂决定使⽤WebKit,但WebKit.NET也没有直接提供传递对象的⽅法,后来发现⼜⼀个好东西:
1. open-webkit-sharp:对webkit的⼜⼀次封装,提供了很多新功能。google上下载地址:
下⾯的使⽤就⾮常简单了,下载open-webkit-sharp后,把Core⽂件夹和References⽂件夹下所有⽂件拷贝到你的⼯程⽬录下,然后打开你的项⽬,添加引⽤OpenWebKitSharp.dll和WebKit.Interop.dll(如果你的项⽬运⾏在.NET Framework 2.0 或 3.5 引⽤ Binary_NET2⽂件夹下的这两个⽂件,NET4.0的话就引⽤Binary⽂件夹下的这两个dll);然后就是⼯具箱->选择项->选择OpenWebKitSharp.dll,然后从⼯具箱中把WebKitBrowser拖到你的窗体上.现在已经成功了⼀⼤步了,但是为了避免使⽤时遇到各种错误,我们需要先安装两个⽀持⽂件:
1. Microsoft C++ 2005 Redistributable  XP/Vista/7 32/64 Bit
2. Apple QuickTime (Optional - for better HTML5 Support)
Ready!开始传递对象:
[csharp]
1. private void Form1_Load(object sender, EventArgs e)
2. {
3.    this.webKitBrowser1.Navigate("yourWebSiteUrl");
4.    this.webKitBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webKitBrowser1_DocumentCompleted);
5. }
6. void webKitBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
7. {
8.    this.webKitBrowser1.GetScriptManager.ScriptObject = new myClass();
9. }
[csharp]
1. private void Form1_Load(object sender, EventArgs e)
2. {
3.    this.webKitBrowser1.Navigate("yourWebSiteUrl");
4.    this.webKitBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webKitBrowser1_DocumentCompleted);
5. }
6. void webKitBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
7. {
8.    this.webKitBrowser1.GetScriptManager.ScriptObject = new myClass();
9. }
前台调⽤⽅式类似IE的webbroswer,也使⽤al调⽤,你也可以⾃⼰定义⼀个对象:
[csharp]
1. this.webKitBrowser1.GetScriptManager.EvaluateScript("var al;");
[csharp]
1. this.webKitBrowser1.GetScriptManager.EvaluateScript("var al;");
这样调⽤的时候就能⽤你⾃⼰定义的对象名访问了。
应该也有直接⾃⼰定义对象的⽅法,但是open-webkit-sharp中⽂的资料实在的不多,耐着性⼦看了⼏天⽼外的论坛,⼀⽔的全是吐槽,实际解决问题的不多。等有更好的⽅法,也请⼤家不吝赐教。
chrome直接下载李民权

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。