基於.net開發chrome核心瀏覽器

 

這是一個系列的文章,前面六篇文章的地址如下:

基於.net開發chrome核心瀏覽器【六】 

基於.net開發chrome核心瀏覽器【五】 

基於.net開發chrome核心瀏覽器【四】 

基於.net開發chrome核心瀏覽器【三】 

基於.net開發chrome核心瀏覽器【二】 

基於.net開發chrome核心瀏覽器【一】 

這篇文章和前面六篇文章關係不大,你如果懶得看前面六篇的話,從這一篇開始看也沒問題

 

之前寫的六篇文章,都是基於 Xilium.CefGlue開源項目的,

後來又接觸過 CefSharp(據說github的客戶端也是用這個開發的,但用起來感覺有點蛋疼)

隨後又用過 chromiumfx,這個項目雖然用的人沒有CefShrp多,但用起來真的很舒心

有時間的話,我再做一下這三個項目的橫向對比。

 

上面三個項目都是基於 CEF的,說實在的 CEF這個項目帶有強烈的種族歧視色彩

早在2011年的時候就有國人提到 輸入法提示框不能跟隨輸入光標的問題

並給出瞭解決方案,請求合併到主幹上,但這個項目的負責人,並沒有持續跟進這個問題

直到上週一才解決掉這個問題,這期間不知道有多少中、日、韓的開發者在這個問題上糾結

我只能狠狠的說一句“我去年買了個表的!”(當然這是開玩笑的話,我還是尊重開源界所付出的心血和汗水的)

目前CefSharp、CefGlue、chromiumfx都還沒有更新,這個問題在這三個項目上依然存在。

 

另外不得不說一下 nw.js,這是一個國內牛人做的開源項目,我關注了很久了!

nodejs+chromium核心並且還共用V8引擎,對chromium封裝的非常好,你幾乎挑不出任何毛病

想 用nw.js開發一個瀏覽器也不是不可能,但一定要用nodejs就有點蛋疼了,

我曾經給作者 Roger Wang發過郵件,哀求他做一個go語言或C#的封裝,

郵件如泥牛入海,再無迴音,不過話又說回來人,家是牛人,你又能咋滴!

 

我們這次要說的是基於chromiumfx開源項目做瀏覽器應用,言歸正傳!

 

環境部署

首先你的 下載chromiumfx的類庫,注意,你要記下他的版本號,比如目前最新的版本號是:3.2171.13

其次你要 下載CEF的類庫,注意,這裏下載的版本號要和前面記下的版本號前兩個數字一致,這裏就是:3.2171.2069

 

創建一個winform的工程,運行一下,並在debug目錄下創建一個cef的目錄:“bin\Debug\cef”

然後把你下載的CEF壓縮包解壓縮,把release子目錄下的東西,都拷貝到 bin\Debug\cef

然後把Resources子目錄下的東西也拷貝到 bin\Debug\cef

然後解壓縮chromiumfx壓縮包,把名稱以libcfx開頭的文件拷貝到bin\Debug\cef目錄

最後這個目錄下大概應該有這些內容:

 

然後讓你的工程引用ChromiumWebBrowser.dll和ChromiumFX.dll, 並讓這兩個DLL拷貝到本地

然後設置你的程序集的屬性

“生成”的“目標平臺”是x86

“調試”的時候,不能“啓用VisualStudio承載進程”

 

啓動和終止Chromium的運行時

先來看代碼

Initialize的時候,程序會去你的執行路徑下找cef子目錄,並加載相關的類庫

Shutdown的時候,程序會回收掉 Chromium運行時佔用的一些資源;

你也可以通過這種方式來設置一個具體的路徑

CfxRuntime.LibCefDirPath = @"C:\path\to\cef\directory";

ChromiumWebBrowser.Initialize();

 

使用瀏覽器控件並把他顯示在窗體上

就這麼三行代碼,很簡單吧

 

讓瀏覽頁面裏的iframe執行JS腳本

先看代碼:

var f = wb.GetFrame("mem_index");

var js = File.ReadAllText("login.js", Encoding.UTF8);

f.ExecuteJavaScript(js, "", 0);

好,來解釋一下這幾行代碼

第一行代碼

用webbrowser控件獲取一個iframe有好幾個重載方法

我這裏輸入的是iframe的name,

還有CfxFrame GetFrame(long identifier);注意這裏可不是iframe的id哦

還有一個函數挺有用的

List<string> GetFrameNames();

得到頁面中所有iframe的名字

第二行代碼就不用解釋了

你看到我寫了login.js應該知道我不是在做什麼好事兒

第三行代碼就是讓這個iframe執行這段JS腳本

方法的簽名是這樣的:

void ExecuteJavaScript(string code, string scriptUrl, int startLine);

如果你的iframe已經加載了jquery,那麼你執行的代碼也是可以使用jqeury的

第二個參數和第三個參數都是和出錯調試有關的

 

瀏覽器加載狀態變更事件

wb.OnLoadingStateChange += wb_OnLoadingStateChange;

 

void wb_OnLoadingStateChange(object sender, Chromium.Event.CfxOnLoadingStateChangeEventArgs e)

{

            if (e.IsLoading == false)

            {

                 //do what you want

            }

}

加載完成的時候e.IsLoading的值是false

 

後記

就寫到這裏,以後再寫本系列的第八篇

第八篇的內容將包含:

接管js對話框,並自動觸發是或否的按鈕

JS和C#通信

給頁面或iframe註冊全局的回調函數

接管或屏蔽頁面的請求

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章