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需要對要調用的類進行設定
- 對類設定COM+元件可見
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]//COM+元件可見
- 在webKitBrowser_DocumentCompleted需加入指定的代碼
private void mainWeb_DocumentCompleted(object sender, webBrowserDocumentCompletedEventArgs e)
{
mainWeb.GetScriptManager.ScriptObject = this;//設定腳本對象
mainWeb.GetScriptManager.EvaluateScript("var obj=window.external;");//設定腳本字首相容webbrowser的寫法
}
- 在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