如果您在应用程序中有一个chrome嵌入式Web浏览器小部件,是否有办法通知应用程序在任何时间点发生了某些事情?例如,假设项目已调整大小或单击按钮,它是在chrome embedded小部件中加载的基于javascript的页面。如何通过代码通知C ++或Delphi应用程序(或任何应用程序)并向其发送消息或回调?我正在寻找类似sendMessage功能的东西,以便向应用程序传达已发生的事情。
如何执行此操作的示例可以是C ++ ,. Net或Delphi,也可以是任何语言......因为我可以简单地将代码移植到我的Delphi语言中。
换句话说,您如何从javascript与具有chrome嵌入式Web浏览器的应用程序进行通信?当页面加载完成后,您可以通过该页面加载结束事件进行通信...但是,即使页面加载后javascript代码也会运行,特别是如果用户使用鼠标拖动页面上的项目或单击一个按钮..那么你如何随时与C ++ / Delphi应用程序进行通信,发生了什么事?
FYI可以完全访问html / java代码,即我可以在javascript中添加自己的代码..我想要的任何代码。所以,如果有类似sendMessageBackToApp的东西,那么我想添加它。
如果此功能不可用,它肯定会有用。应用程序和javascipt / html之间的通信对于应用程序真正强大至关重要。
答案 0 :(得分:2)
以下对Chromium GuiClient演示的补充在D7中适用于我:
procedure TMainForm.TestJS;
begin
if crm.Browser <> nil then
crm.Browser.MainFrame.ExecuteJavaScript(
'alert(''JavaScript execute works!''); console.log(''From Javascript'')', 'about:blank', 0);
end;
procedure TMainForm.crmConsoleMessage(Sender: TObject; const browser:
ICefBrowser; const message, source: ustring; line: Integer; out Result:
Boolean);
begin
ShowMessage('OnConsoleMessage: ' + Message);
Result := True;
end;
请参阅此处以获得更全面的讨论:https://groups.google.com/forum/#!topic/delphichromiumembedded/uDxAUTvXqzc
答案 1 :(得分:1)
有两种方法可以与CEF中的本机代码进行通信。
&#34;异步JavaScript绑定&#34; - 这里描述了这种方法(有一个同名的章节): https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage.md
您还可以创建实际在渲染器进程中调用C ++代码的JS函数对象。你可以在这里读更多关于它的内容: https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md
第二种方式更低级别。您必须使用CEF的IPC机制与浏览器进程通信。
答案 2 :(得分:0)
总之:扩展。您可以从程序中注册程序(CefRegisterExtension)JS代码。 https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md描述了通常的步骤。 谨防CEF问题1944(仍未解决) - JS必须是防弹或加载它的渲染器可以(并且它会)崩溃。