在查看了 Chromium Embedded Framework 示例后,我有一个问题。我需要与窗口的嵌入式部分进行本机交互。但是,在 CEF 示例中,我看到的只是 c++ 向浏览器发送消息,而不是相反。我想知道是否有任何方法可以从 c++ 中的 JavaScript 发送消息,例如以函数的方式。
我正在寻找的是这样的东西。我的网页中有一个按钮,单击该按钮。我想最小化窗口。有什么方法可以在 CEF 中从 JavaScript 调用一些 c++ 吗?
在查看了 Chromium Embedded Framework 示例后,我有一个问题。我需要与窗口的嵌入式部分进行本机交互。但是,在 CEF 示例中,我看到的只是 c++ 向浏览器发送消息,而不是相反。我想知道是否有任何方法可以从 c++ 中的 JavaScript 发送消息,例如以函数的方式。
我正在寻找的是这样的东西。我的网页中有一个按钮,单击该按钮。我想最小化窗口。有什么方法可以在 CEF 中从 JavaScript 调用一些 c++ 吗?
如果有人需要一个例子,这是我做到的一种方式:
确定您希望使用的自定义“协议”,这是一个作为宏字符串的示例 #define PROTO_MYAPPCOMMAND "myapp://"
在您的自定义 CefApp 类(继承自 CefApp 的类)上,也继承自 CefRenderProcessHandler。
实现 OnBeforeNavigation() 函数:
//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';
};
在页面 js 中(即在按钮/div 中单击)
<div class="exitbutton" onclick="MYHOST.ExitApp();">Exit</div>
如果需要传入参数,只需在js中的url中追加,在cpp中解析字符串即可,如下所示:
MYHOST.DoSomething = function() {
window.location = 'myapp://command.dosomething?param1=' + value1 + "¶m2=" + value2 + "¶m3=" + value3;
};
注意:我已经简化了代码,但请添加验证等
希望这可以帮助!
没有严肃的方法可以做到这一点,需要一行代码:
Console.Log('. ...') 在您需要发送到应用程序的字符串/数据结构前面带有前导 ESC 字符。只需执行“OnConsoleMessage”并根据前导或非 ESC 字符触发准确的作业。
PS:我不得不在 2015 年使用这个棘手的解决方案,因为 DCEF3 版本对于方案处理程序的使用来说是错误的。
对于严肃的工作:注册自定义方案处理程序很好。
最简单的方法: 1. 在主进程(UI 进程) - 您可以创建自己的自定义方案处理程序(它也可以绑定到 http 协议,并且可以通过域来区分处理程序)。2. 从 JS 端,您可以使用 XMLHttpRequest 调用您的方案处理程序。它是 JS<>Main 进程之间 IPC 的标准机制。
其他方式:使用 V8 绑定,但在这种情况下,您需要在渲染器和主进程之间建立自己的 IPC。或者使用内置的 IPC,但请注意它仅以异步方式发送消息。