Как убить подпроцесс Chromium embedded framework?

в компьютерной игре у меня есть игровой браузер, используемый для новостей, магазина виртуальной валюты и социальных сетей. Он построен с довольно свежим обновлением Chromium Embedded Framework. Проблема в том, когда я открываю окно браузера (веб-сайт там работает нормально), а затем закрываю, для некоторых веб-сайтов подпроцесс CEF не заканчивается. Я также могу продолжать слышать звук, если это было видео Youtube, например. Я использую экранный рендеринг, другие собственные окна не создаются, только подпроцессы. Чтобы закрыть браузер окно я удаляю все ссылки на CefBrowser и вызываю:

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

Я также пробовал другие способы закрыть/уничтожить / завершить этот подпроцесс рендеринга, такие как загрузка "about:blank" перед закрытием, но это не помогло: процесс бодрствовал, звук продолжал играть. Важное примечание: это происходит только на определенных веб-сайтах, которые, я полагаю, используют некоторые функции, что другие нет. Когда я попытался отключить JavaScript в настройках CEF, ошибка исчезла, но мне нужен JS.

  1. Is есть способ принудительно убить подпроцесс браузера? (Обратите внимание, что GetWindowHandle возвращает 0, потому что у него нет окна)
  2. есть ли другой способ правильно завершить браузер, который я не знаю?
  3. какая особенность веб-сайтов может вызвать такую ошибку?

спасибо!

конфигурация времени выполнения CEF: мультипроцесс, однопоточный цикл сообщений, с подпроцессом, безоконный рендеринг, без песочницы.

конфигурация ПК: ОС Windows 8, VS 2010, Chromium Embedded Framework версии 3.3071, сборка 1649, язык C++.

2 ответов


вы должны проверить свою реализацию 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);
}

foreach (var process in Process.GetProcessesByName("CefSharp.BrowserSubprocess"))
{
    process.Kill()
}