在查看了Chromium嵌入式框架示例之后,我有一个问题。我需要与窗口的嵌入式部分进行本地交互。然而,在CEF示例中,我只看到了c++向浏览器发送消息,没有相反的情况。 我想知道是否有办法从JavaScript中向c++发送消息,就像使用函数一样。
我正在寻找的是这样的东西。我在网页中有一个按钮,当单击时,我希望最小化窗口。在CEF中,有没有办法从JavaScript调用一些c++?
在查看了Chromium嵌入式框架示例之后,我有一个问题。我需要与窗口的嵌入式部分进行本地交互。然而,在CEF示例中,我只看到了c++向浏览器发送消息,没有相反的情况。 我想知道是否有办法从JavaScript中向c++发送消息,就像使用函数一样。
我正在寻找的是这样的东西。我在网页中有一个按钮,当单击时,我希望最小化窗口。在CEF中,有没有办法从JavaScript调用一些c++?
Determine the custom 'protocol' you wish to use here's an example as a macro string #define PROTO_MYAPPCOMMAND "myapp://"
On your custom CefApp class (the one inheriting from CefApp), also inherit from CefRenderProcessHandler.
implement the OnBeforeNavigation() function:
//declare (i.e. in header)
virtual bool OnBeforeNavigation(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request,
NavigationType navigation_type, bool is_redirect) OVERRIDE;
//implementation
bool CClientApp::OnBeforeNavigation(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request,
NavigationType navigation_type, bool is_redirect)
{
CefString cefval = request->GetURL();
CString csval = cefval.c_str();
if (csval.Find(PROTO_MYAPPCOMMAND, 0) == 0)
{
//process the command here
//this is a command and not really intended for navigation
return true;
}
return false; //true cancels navigation, false allows it
}
以下是添加“退出”应用程序按钮的示例:
在cpp中:
#define STR_COMMANDAPPEXIT _T("command.appexit")
bool CClientApp::OnBeforeNavigation(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, NavigationType navigation_type, bool is_redirect)
{
CefString cefval = request->GetURL();
CString csval = cefval.c_str();
if (csval.Find(PROTO_MYAPPCOMMAND, 0) == 0)
{
CString command = url;
command.Replace(PROTO_MYAPPCOMMAND, _T(""));
if (command.Find(STR_COMMANDAPPEXIT, 0) == 0)
{
::PostMessage(hwnd, WM_CLOSE, NULL, NULL);
}
//this is a command and not really intended for navigation
return true;
}
return false; //true cancels navigation, false allows it
}
还创建了一个JS实用程序文件,用于所有操作,简化调用它们的过程
var MYHOST = MYHOST || {};
/// Exit the Application (host app)
MYHOST.ExitApp = function() {
window.location = 'myapp://command.appexit';
};
<div class="exitbutton" onclick="MYHOST.ExitApp();">Exit</div>
MYHOST.DoSomething = function() {
window.location = 'myapp://command.dosomething?param1=' + value1 + "¶m2=" + value2 + "¶m3=" + value3;
};
有一种不严谨的方法可以实现此操作,只需要一行代码:
在您需要发送到应用程序的字符串/数据结构前面加上ESC字符,然后使用Console.Log('. ...')。只需实现“OnConsoleMessage”并根据是否有前导ESC字符触发准确的工作。
注:我在2015年不得不使用这种巧妙的解决方案,因为DCEF3版本在方案处理程序使用方面存在错误。
对于重要工作:注册自定义方案处理程序就可以了。