使用cef的3626 X64版本 支持MP4放在了Git上
几个注意点
一、交互问题
1、c++调用js
使用ExecuteJavaScript函数
例:
CefRefPtr<CefBrowser> browser = ...;
CefRefPtr<CefFrame> frame = browser->GetMainFrame();
frame->ExecuteJavaScript("alert('ExecuteJavaScript works!');",
frame->GetURL(), 0);
注意:参数中存在",需要先处理
str.Replace(_T("\""),_T("\\\""));
2、js调用c++
(1)添加类CCefBrowserApp继承CefRenderProcessHandler,重写方法OnContextCreated,例
void CCefBrowserApp::OnContextCreated(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
CefRefPtr<CefV8Context> context)
{
CefRefPtr<CefV8Value> object = context->GetGlobal();
CefRefPtr<CefV8Value> str = CefV8Value::CreateString(_T("My Value!"));
object->SetValue(_T("myval"), str, V8_PROPERTY_ATTRIBUTE_NONE);
CefRefPtr<CefV8Value> window = context->GetGlobal();
CefRefPtr<CefV8Handler> handler = new ClientV8ExtensionHandler();
CefRefPtr<CefV8Value> callback = CefV8Value::CreateFunction(_T("CPPCALLBACK"), handler);
window->SetValue(_T("CPPCALLBACK"), callback, V8_PROPERTY_ATTRIBUTE_NONE);
}
向windows中注册CPPCALLBACK方法
(2)添加类ClientV8ExtensionHandler继承CefV8Handler,重写方法Execute,例
bool ClientV8ExtensionHandler::Execute(const CefString &name, CefRefPtr<CefV8Value> object, const CefV8ValueList &arguments, CefRefPtr<CefV8Value> &retval, CefString &exception)
{
if (name == "CPPCALLBACK")
{
if(arguments.size() > 0 && arguments[0]->IsString())
{
CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create(arguments[0]->GetStringValue());
CefRefPtr<CefListValue> args = msg->GetArgumentList();
args->SetSize(arguments.size() - 1);
for(int i = 1;i < arguments.size();i++)
{
if(arguments[i]->IsBool())
args->SetBool(i-1, arguments[i]->GetBoolValue());
else if(arguments[i]->IsDate())
args->SetDouble(i-1, arguments[i]->GetDateValue().GetDoubleT());
else if(arguments[i]->IsDouble())
args->SetDouble(i-1, arguments[i]->GetDoubleValue());
else if(arguments[i]->IsInt())
args->SetInt(i-1, arguments[i]->GetIntValue());
else if(arguments[i]->IsString())
args->SetString(i-1, arguments[i]->GetStringValue());
else if(arguments[i]->IsUInt())
args->SetInt(i-1, arguments[i]->GetUIntValue());
}
return CefV8Context::GetCurrentContext()->GetBrowser()->SendProcessMessage(PID_BROWSER, msg);
}
return true;
}
return false;
}
(3)添加类CCefBrowserEventHandler继承CefClient,重写方法OnProcessMessageReceived,例
bool CCefBrowserEventHandler::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
if(m_pDelegate)
return m_pDelegate->CallbackFromJS(browser.get(), message->GetName().c_str(), message->GetArgumentList().get());
return false;
}
这儿为最终处理位置
(4)js调用方法CPPCALLBACK
window.CPPCALLBACK("postMessage", "ready")