日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xilium.CefGlue的入门

發布時間:2024/9/5 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xilium.CefGlue的入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

資源地址:

源碼:https://gitlab.com/xiliumhq/chromiumembedded/cefglue

官方論壇:http://www.magpcss.org/ceforum/?

cef:http://opensource.spotify.com/cefbuilds/index.html

里面有各個版本的下載;

? 很少寫博客,寫的不好,請多多包含,主要是記錄工作中的一些問題,和園子里朋友一起討論學習。

? 寫埋坑記錄之前,我先介紹下為什么會使用這個webkit內核的瀏覽器組件,我是wpf項目使用富文本編輯器,話說wpf平臺里面原生支持比較好的富文本編輯器還真沒用,還有一個原因我這個編輯器還要集成數學公式的輸入輸出,那就必須要自定義控件顯現,考慮到web端的通用,最后決定用百度編輯器UEDITORjq插件。

? cefglue底層是C/C++項目,主要是通過平臺調用p/invoke實現。cefglue代碼下載地址是:https://bitbucket.org/xilium/xilium.cefglue/overview,動態鏈接庫下載地址:http://xilium.bitbucket.org/cefglue/,注意要FQ。

? 代碼結構我就不說了,里面有winform wpf 等版本,當然主要的功能已經實現,如果需要特定功能需額外定制。出于項目需要,我主要實現了有一下幾個功能。

? 1.執行js獲取返回值。

? 2.js回調后臺方法。

? 獲取返回值,CEF使用V8引擎實現javascript操作。瀏覽器中的每一個Frame都有它自己的JS上下文,上下文提供一種線程安全機制來執行頁面上的JS代碼
JS運行在獨立的渲染進程中,同渲染線程同一個線程。渲染進程的中的主線程使用TID_RENDERER來標示,所有的V8操作必須在這個線程上執行。JS執行相關的回調通過CefRenderProcessHandler暴露出來實現回調。主要代碼:

protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message)
{
string[] items = message.Name.Split(new char[] { '|' });
if (items.Length == 0) return false;

switch (items[0])
{
case "EvaluateScript":
{
CefV8Value value = CefV8Value.CreateString("t");
CefV8Exception exp;
browser.GetMainFrame().V8Context.TryEval(items[1], out value, out exp);
CommonObj.JsEvaResult = null;
if (value == null)
{
CommonObj.flag = true;
return true;
}
else
if (value.IsArray)
{

}
else
if (value.IsString)
{
CommonObj.JsEvaResult = value.GetStringValue();
}
else
if (value.IsInt)
{
CommonObj.JsEvaResult = value.GetIntValue();
}
else
if (value.IsDouble)
{
CommonObj.JsEvaResult = value.GetDoubleValue();
}
else
if (value.IsBool)
{
CommonObj.JsEvaResult = value.GetBoolValue();
}
else
if (value.IsDate)
{
CommonObj.JsEvaResult = value.GetDateValue();
}
CommonObj.flag = true;
return true;
}

從寫CefRenderProcessHandler基類OnProcessMessageReceived方法,此處一定要注意,在外部多線程環境里面執行,一定要封送渲染線程上下文環境,要不無法回調。

2.js回調后臺,第一種方法:網上有很多朋友通過ajax請求實現,原理是截獲請求報文,獲取請求參數,實現動態反射。第二種方法:瀏覽器窗口中的每個頁面都有V8上下文。上下文包含了頁面中所有的變量、對象和方法,如果我們注冊了CefV8HandlerV8上下文處理器,并且在本地代碼中保存當前上下文的引用和JS函數那么可以輕松實現js回調。

主要思路,代碼太多,如果需要代碼的可以給我留言:

1.生成本地js和頁面js映射。2.實現V8引擎,從寫Excute方法。3.創建js回調類,包含頁面js函數聲明方法,主要是為了V8Excute方法里面動態反射調用。

?到現在為止,js回調后臺方法實現,但是新的問題來了。沒辦法確定是哪個瀏覽器里面的js觸發的回調。我的做法是,在每個瀏覽器加載頁面完成的時候生成一個GUID標識瀏覽器對象id,執行頁面js函數,寫入到頁面隱藏域里面,便于后面的回調傳入這個標識ID。

目前項目中用到的就這幾個功能,寫的不好不要拍磚,需要源代碼的可以給我留言。

轉載于:https://www.cnblogs.com/feelSku/p/10016996.html

總結

以上是生活随笔為你收集整理的Xilium.CefGlue的入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。