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

标签 chromium chromium-embedded

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

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

我不知道如何使用 ChromiumFx 和 ChromiumWebBrowser 类成功完成此任务。第一个问题是 ChromiumWebBrowser.Initialize 函数创建了 CfxApp 对象,因此我没有合适的地方附加到 GetRendererHandlerProcess 事件并响应我对此处引用的 CefRenderProcessHandler 接口(interface)的实现。 http://magpcss.org/ceforum/apidocs3/projects/(default)/CefRenderProcessHandler.html

根据我的阅读,我需要实现该接口(interface)的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# 代码。

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

有什么我想念的吗?或者,在某处是否有使用 ChromiumFx 完成此操作的示例?这是该函数的文档链接。

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

我相信我正在尝试做的是在进程运行时消息标题下的 cef wiki 页面中解释的内容:https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-inter-process-communication-ipc

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

最佳答案

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

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

关于ChromiumFx/Cef 如何将自定义 IPC 消息发送到渲染器进程并执行自定义 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50534567/

相关文章:

javascript - Electron.js : how to create a separate download webContents. 窗口 session ?

delphi - 是否可以像TWebBrowser一样在Delphi中使用Microsoft Edge(Chromium引擎)?

c# - CefSharp 加载HTML

javascript - CEF 支持哪个版本的 ECMAScript?

c# - 在 Mac 应用程序中托管嵌入的 Chromium

c# - 头孢夏普 winforms : Inject jquery into page

javascript - 为什么这个函数调用的执行时间会发生变化?

python - 通过 xpath 枚举元素时 Selenium chromedriver 异常

java - 正确的 Chrome 浏览器品牌?

swing - 加载 jcef 浏览器窗口后无法切换 JPanels