c++ - 如何杀死 Chrome 嵌入式框架子进程?

标签 c++ chromium-embedded

在 PC 游戏中,我有用于新闻、虚拟货币商店和社交网络的游戏内浏览器。它是用 Chromium Embedded Framework 的全新更新构建的。问题是当我打开一个浏览器窗口(网站在那里工作正常)然后关闭时,对于某些网站,CEF 子进程没有完成。我也可能会继续听到音频,例如,如果是 Youtube 视频。我使用离屏渲染,不创建其他原生窗口,只创建子进程。为了关闭浏览器窗口,我删除了对 CefBrowser 的所有引用并调用:

m_browser->GetHost()->CloseBrowser(true);

我还尝试了其他方法来关闭/销毁/完成渲染子进程,例如在关闭前加载“about:blank”,但这无济于事:进程保持清醒,音频继续播放。 重要说明:它只发生在某些网站上,我想这些网站使用了某些功能,而其他网站则没有。当我尝试在 CEF 设置中禁用 JavaScript 时,错误消失了,但我需要 JS。

  1. 有没有办法强制终止浏览器子进程? (注意 GetWindowHandle 返回 0,因为它没有窗口)
  2. 还有其他我不知道的正确终止浏览器的方法吗?
  3. 网站的哪些功能可能导致此类错误?

谢谢!

CEF 运行时配置:多进程、单线程消息循环、带子进程路径、无窗口渲染、无沙箱。

PC 配置:操作系统 Windows 8、VS 2010、Chromium Embedded Framework 版本 3.3071、build 1649、C++ 语言。

最佳答案

您应该检查您对 onbeforeunload 的实现。

CEF GeneralUsage关于 CefBrowserHost::CloseBrowser 的文章: 然后父窗口需要调用 CloseBrowser(false) 并等待第二个操作系统关闭事件以指示浏览器已允许关闭。如果关闭被 JavaScript“onbeforeunload”事件处理程序或 DoClose() 回调取消,则不会发送第二个操作系统关闭事件。

如果您仍然只想终止子进程,我建议您使用浏览器 IPC 消息并在应用程序中退出。 在你的游戏运行中

CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create(KILL_subprocess);
m_browser->SendProcessMessage(PID_RENDERER, msg);

并在子流程中实现“OnProcessMessageReceived”:

if (msg->GetName() == KILL_subprocess)
{
    delete this;
    std::exit(EXIT_FAILURE);
}

关于c++ - 如何杀死 Chrome 嵌入式框架子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46000837/

相关文章:

c++ - boost::interprocess message_queue - Windows 7 低完整性进程

c++ - 我如何指定必须静态链接库 X?

delphi - 在 Chromium 嵌入式浏览器中隔离 cookie/用户的正确方法是什么?

c++ - 用 less 子句结构聚合初始化,为什么它初始化所有东西?

c++ - 说到序列, "vector[n].push_back()"总是 O(1) 吗?

c++ - 如何将输出对齐到屏幕中心 - C++?

xcode - 有人能解释一下如何将 Chromium 包含在现有的 XCode 项目中吗?

cefsharp - 使用 CEFSharp 处理带有 "quick view"选项的特殊网站上的 PDF 文件

java - JCEF - Java 运行时环境检测到 fatal error

c++ - 在 CEF 客户端中拖动时的图像预览