【问题标题】:CEF closing/resizing issues inside a big application plugin大型应用程序插件中的 CEF 关闭/调整大小问题
【发布时间】:2016-07-21 17:44:10
【问题描述】:

我正在用 C++ 为大型 x64 应用程序编写插件。我希望插件打开一个对话框并显示我网站的 Web 视图。 我能够在 macOS 中使用 WKWebView 并且效果很好。在 Windows 上,我正在评估 CEF https://bitbucket.org/chromiumembedded/cef(请告诉我任何替代方案,理想情况下我希望它基于 Webkit)。

假设托管我的插件的应用程序框架已经为我的插件创建了一个窗口并且有它自己的消息循环,所以我只能在某种 WindowProc 中接收事件。我也可以得到窗口的HWND。

我的实现受到 cefsimple 示例的启发,因为 cefclient 太复杂了。我已经使用外部可执行文件实现了子进程架构,并且一切正常,直到它呈现窗口的客户区域。然后我在关闭窗口(崩溃)和交互式调整窗口大小时遇到​​问题(窗口框架已调整大小,但客户区中的 Web 视图未调整大小)。

我已经尝试了所有可能的组合,但我的想法已经用完了。即:

  • 如果我使用 CefRunMessageLoop(),Web 视图会正确呈现,但主应用程序不会处理诸如关闭窗口按钮之类的 UI 事件。调整大小不起作用。
  • 如果我自己偶尔调用 CefDoMessageLoopWork()(来自 WindowProc),Web 视图会正确呈现并处理关闭按钮,但它会崩溃。调整大小不起作用。
  • 如果我使用 settings.multi_threaded_message_loop = true ,则 Web 视图将正确呈现,并且我可以关闭窗口而不会崩溃。窗口的析构函数调用 CefShutdown()。但是,如果我尝试重新打开窗口,它就会崩溃! CefInitialize 和 CefShutdown 是否只允许调用一次? 并且调整大小仍然不起作用。我不明白为什么在 cefsimple 示例中调整大小有效而在我的窗口中它不起作用。

除了消息处理问题,可能我没有正确关闭浏览器,有什么建议吗?为什么这么复杂? WKWebView 太直接了!

【问题讨论】:

    标签: c++ windows plugins 64-bit chromium-embedded


    【解决方案1】:

    没有错误消息,没有堆栈跟踪,没有源代码,没有 OS/CEF 版本 - 我怀疑这个问题可以回答。

    我只能告诉你如何干净地关闭浏览器:在正确的时间调用 CefShutdown(参见 cefclient/cefsimple 示例)并且在调用关闭时不要保留对 CEF 对象的任何引用。

    【讨论】:

      猜你喜欢
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多