ChromiumFx / Cef如何将自定义IPC消息发送到渲染器进程并执行自定义c#代码

时间:2018-05-25 17:54:36

标签: chromium chromium-embedded

我一直试图弄清楚如何从浏览器进程向渲染器进程发送自己的自定义IPC消息,以便可以在渲染器进程的UI线程上处理它。我想在渲染器进程的实际UI线程上执行我自己的c#或c ++代码。

根据我在某些论坛上发现的内容,这应该通过实现CefRenderProcessHandler接口,然后将我创建的类的实例返回给CefApp中的GetRendererProcessHandler函数来完成。

我能够弄清楚如何使用ChromiumFx和ChromiumWebBrowser类成功完成此任务。第一个问题是ChromiumWebBrowser.Initialize函数创建了CfxApp对象,因此我没有一个好地方可以附加到GetRendererHandlerProcess事件并使用我在这里引用的CefRenderProcessHandler接口的实现进行响应。 http://magpcss.org/ceforum/apidocs3/projects/(default)/CefRenderProcessHandler.html

根据我所读到的,我需要实现该接口的OnProcessMessageReceived函数,以便在Renderer进程收到IPC消息时能够正确处理它。

出于探索目的,我尝试更改ChromiumWebBrowser.Initialize函数以接受我传入的CfxApp对象,以便我可以订阅GenRenderHandlerProcess并提供我自己的派生自CfxRenderProcessHandler的类,但我的事件处理程序永远不会受到影响在浏览器过程中。

当它不起作用时,我接下来尝试附加到ChromiumFx RenderProcessHandler类中的OnProcessmessageReceived事件。现在,当我使用此代码发送消息时,它会在线程池线程的浏览器进程中触发我的断点(我假设它代表实际渲染器进程中的渲染器线程)。

CfrProcessMessage myMessage = CfrProcessMessage.Create("HelloWorld-Remote");
            CfrListValue args = myMessage.ArgumentList;
            bool success = args.SetString(0, "Chris"); 
            success = e.Browser.SendProcessMessage(CfxProcessId.Renderer, myMessage);

这对我没有帮助,因为我想在实际的渲染器进程UI线程上执行自定义c#代码。

我在RemoteProcedure方法的ChromiumFx的CfxProcessMessageCreateRemoteCall类中放了一些调试语句。我可以通过我的调试语句看到,当我发送消息时,这个代码在实际的渲染器进程中受到了影响,但我不知道如何实现我自己的自定义代码来执行。我无法看到在实际渲染过程中调用OnProcessMessageReceived函数的位置。

我有什么遗失的东西吗?或者,有一个例子说明如何使用ChromiumFx完成此操作?以下是该功能文档的链接。

http://magpcss.org/ceforum/apidocs3/projects/(default)/CefRenderProcessHandler.html#OnProcessMessageReceived(CefRefPtr%3CCefBrowser%3E,CefProcessId,CefRefPtr%3CCefProcessMessage%3E)

我相信我要做的是在cef wiki页面的Process Runtime Messages标题下解释的内容:https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-inter-process-communication-ipc

提前感谢您提供任何帮助/想法。

1 个答案:

答案 0 :(得分:0)

您应该查看CEF文档的“入口点功能”部分 https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-entry-point-function

您需要确保在渲染过程入口点设置正确的渲染过程处理程序。