Xilium.CefGlue的入门
資源地址:
源碼:https://gitlab.com/xiliumhq/chromiumembedded/cefglue
官方論壇:http://www.magpcss.org/ceforum/?
cef:http://opensource.spotify.com/cefbuilds/index.html
里面有各個(gè)版本的下載;
? 很少寫博客,寫的不好,請(qǐng)多多包含,主要是記錄工作中的一些問題,和園子里朋友一起討論學(xué)習(xí)。
? 寫埋坑記錄之前,我先介紹下為什么會(huì)使用這個(gè)webkit內(nèi)核的瀏覽器組件,我是wpf項(xiàng)目使用富文本編輯器,話說wpf平臺(tái)里面原生支持比較好的富文本編輯器還真沒用,還有一個(gè)原因我這個(gè)編輯器還要集成數(shù)學(xué)公式的輸入輸出,那就必須要自定義控件顯現(xiàn),考慮到web端的通用,最后決定用百度編輯器UEDITORjq插件。
? cefglue底層是C/C++項(xiàng)目,主要是通過平臺(tái)調(diào)用p/invoke實(shí)現(xiàn)。cefglue代碼下載地址是:https://bitbucket.org/xilium/xilium.cefglue/overview,動(dòng)態(tài)鏈接庫(kù)下載地址:http://xilium.bitbucket.org/cefglue/,注意要FQ。
? 代碼結(jié)構(gòu)我就不說了,里面有winform wpf 等版本,當(dāng)然主要的功能已經(jīng)實(shí)現(xiàn),如果需要特定功能需額外定制。出于項(xiàng)目需要,我主要實(shí)現(xiàn)了有一下幾個(gè)功能。
? 1.執(zhí)行js獲取返回值。
? 2.js回調(diào)后臺(tái)方法。
? 獲取返回值,CEF使用V8引擎實(shí)現(xiàn)javascript操作。瀏覽器中的每一個(gè)Frame都有它自己的JS上下文,上下文提供一種線程安全機(jī)制來執(zhí)行頁(yè)面上的JS代碼
JS運(yùn)行在獨(dú)立的渲染進(jìn)程中,同渲染線程同一個(gè)線程。渲染進(jìn)程的中的主線程使用TID_RENDERER來標(biāo)示,所有的V8操作必須在這個(gè)線程上執(zhí)行。JS執(zhí)行相關(guān)的回調(diào)通過CefRenderProcessHandler暴露出來實(shí)現(xiàn)回調(diào)。主要代碼:
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方法,此處一定要注意,在外部多線程環(huán)境里面執(zhí)行,一定要封送渲染線程上下文環(huán)境,要不無法回調(diào)。
2.js回調(diào)后臺(tái),第一種方法:網(wǎng)上有很多朋友通過ajax請(qǐng)求實(shí)現(xiàn),原理是截獲請(qǐng)求報(bào)文,獲取請(qǐng)求參數(shù),實(shí)現(xiàn)動(dòng)態(tài)反射。第二種方法:瀏覽器窗口中的每個(gè)頁(yè)面都有V8上下文。上下文包含了頁(yè)面中所有的變量、對(duì)象和方法,如果我們注冊(cè)了CefV8HandlerV8上下文處理器,并且在本地代碼中保存當(dāng)前上下文的引用和JS函數(shù)那么可以輕松實(shí)現(xiàn)js回調(diào)。
主要思路,代碼太多,如果需要代碼的可以給我留言:
1.生成本地js和頁(yè)面js映射。2.實(shí)現(xiàn)V8引擎,從寫Excute方法。3.創(chuàng)建js回調(diào)類,包含頁(yè)面js函數(shù)聲明方法,主要是為了V8Excute方法里面動(dòng)態(tài)反射調(diào)用。
?到現(xiàn)在為止,js回調(diào)后臺(tái)方法實(shí)現(xiàn),但是新的問題來了。沒辦法確定是哪個(gè)瀏覽器里面的js觸發(fā)的回調(diào)。我的做法是,在每個(gè)瀏覽器加載頁(yè)面完成的時(shí)候生成一個(gè)GUID標(biāo)識(shí)瀏覽器對(duì)象id,執(zhí)行頁(yè)面js函數(shù),寫入到頁(yè)面隱藏域里面,便于后面的回調(diào)傳入這個(gè)標(biāo)識(shí)ID。
目前項(xiàng)目中用到的就這幾個(gè)功能,寫的不好不要拍磚,需要源代碼的可以給我留言。
轉(zhuǎn)載于:https://www.cnblogs.com/feelSku/p/10016996.html
總結(jié)
以上是生活随笔為你收集整理的Xilium.CefGlue的入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML 转 PDF 之 wkhtmlt
- 下一篇: 【ABP框架系列学习】模块系统(4)