天天看點

C#使用webkit完成與JS的互動C#使用webkit與JS互動

C#使用webkit與JS互動

C#内置的浏覽器webbrowser使用IE核心,對http标準支援較差。可使用webkit作為内置浏覽器,替代webbrowser。

C#版本的webkit目前有兩個開源庫:WebKit.NET-0.5-bin-cairo和open-webkit-sharp,前者最後一次更新是2010年,後者最後一次更新在2013年。

WebKit.NET-0.5測試後沒能與JS互動成功,以下說明是基于open-webkit-sharp。

網絡上此類教程幾乎都是抄來抄去,至少我依照網上教程未能實作成功互動。現将調試成功的步驟整理如下,略去了項目的代碼。

工具與環境

  • vs2017
  • dotnet 4.5
  • open-webkit-sharp,github:https://github.com/Erls-Corporation/open-webkit-sharp

準備工作

需要的項目檔案

  • open-webkit-sharp/core下的所有檔案
  • open-webkit-sharp/Binary下的所有檔案
  • 上述檔案放入bin/debug目錄下

項目環境配置

  • 工程引用WebKit.Interop.dll、OpenWebKitSharp.dll和JSCore.dll三個檔案

使用方法

初始化webkitBrowser

  • 全局定義webkitBrowser
WebKit.WebKitBrowser webKitBrowser;
           
  • 在form_Load中初始化webKitBrowser
webKitBrowser = new WebKit.WebKitBrowser();
webKitBrowser.Dock = DockStyle.Fill;
this.Controls.Add(webKitBrowser);
webKitBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webKitBrowser_DocumentCompleted);
           

此時已經可以使用webKitBrowser打開指定網頁了

webKitBrowser.Navigate("http://www.baidu.com");
           

使用webKitBrowser打開本地頁面

webkit屬于linux風格,打開本地檔案時使用file:///的格式

webKitBrowser.Navigate("file:///f:/index.html");
           

如果線程通路頁面,需使用this.Invoke((EventHandler)(delegate{webKitBrowser.Navigate(url);}));

重點:與頁面的js互動

頁面的JS函數調用C#的函數

webkit需要對要調用的類進行設定

  1. 對類設定COM+元件可見
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]//COM+元件可見
           
  1. 在webKitBrowser_DocumentCompleted需加入指定的代碼
private void mainWeb_DocumentCompleted(object sender, webBrowserDocumentCompletedEventArgs e)
{
	mainWeb.GetScriptManager.ScriptObject = this;//設定腳本對象
	mainWeb.GetScriptManager.EvaluateScript("var obj=window.external;");//設定腳本字首相容webbrowser的寫法
}
           
  1. 在js中的調用C#提供的方法,可直接傳參,非常友善
var info = window.external.getInfo();
var info = window.external.getInfo("info");
           

C#調用JS提供的函數

試了網上的N種方法,摸索找到的有效方法,與webbrowser調用極其類似

object[] objects = new object[2];
objects[0] = "param1";
objects[1] = "param2";
mainWeb.GetScriptManager.CallFunction("callJSFunction", objects);
           

DEMO下載下傳連結https://download.csdn.net/download/flyer822/10993114