在PC游戏中我使用浏览器浏览新闻,虚拟货币商店和社交网络。它是通过Chromium Embedded Framework的全新更新构建的。问题是当我打开一个浏览器窗口(网站工作正常)然后关闭,对于某些网站CEF子流程没有完成。如果是Youtube视频,我也可以继续听音频。我使用屏幕外渲染,不创建其他本机窗口,只创建子进程。要关闭浏览器窗口,我删除对CefBrowser的所有引用并调用:
m_browser->GetHost()->CloseBrowser(true);
我还尝试了其他方法来关闭/销毁/最终化渲染子流程,例如在关闭之前加载'about:blank',但这没有帮助:进程保持清醒,音频继续播放。 重要提示:它只发生在某些网站上,我想这些网站会使用某些功能,而其他网站则不会。当我尝试在CEF设置中禁用JavaScript时,错误消失了,但我需要JS。
谢谢!
CEF运行时配置:多进程,单线程消息循环,具有子进程路径,无窗口呈现,无沙箱。
PC配置:OS Windows 8,VS 2010,Chromium Embedded Framework版本3.3071,build 1649,C ++语言。
答案 0 :(得分:1)
您应该检查onbeforeunload的实现。
CEF GeneralUsage写了关于CefBrowserHost :: CloseBrowser: 父窗口然后需要调用CloseBrowser(false)并等待第二个OS关闭事件以指示浏览器已允许关闭。如果通过JavaScript“onbeforeunload”事件处理程序或DoClose()回调取消关闭,则不会发送第二个OS关闭事件。
如果您仍然想要杀死子流程,我建议您使用浏览器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);
}