CefSharp 73 close/dispose 在 WinForms 中使用选项卡时的子进程

CefSharp 73 close/dispose subprocess when tabbed in WinForms

我使用选项卡控件中的 CefSharp 构建了一个简单的表单。应用程序以 2 个带有 2 个 url 的标签页开始。此站点之一可以在新标签页中打开新弹出窗口,但关闭新标签页不会终止父子进程。

在main方法中调用

 EnablePopup popupok = new EnablePopup();
 browser2.LifeSpanHandler = popupok;
 popupok.popup += Popupallowed;

在我使用的LifeSpanHander中

public class EnablePopup : ILifeSpanHandler
{
    public event Action<string> popup;

    public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        return true;
    }

    public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }

    public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }

    public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
    {
        if (targetUrl.Contains(" my conditions ") == true)
        {
            if (popup != null)
                popup(targetUrl);
        }

        newBrowser = null;
        return true;
    }
}

在我使用的处理程序中

private void Popupallowed(string obj)
    {            
        Invoke(new Action(() => {
            TabPage pop = new TabPage(title);
            prtTabControl.TabPages.Add(pop);
            ChromiumWebBrowser popup = new ChromiumWebBrowser(obj);
            popup.RequestHandler = new DisableNavigate();
            popup.MenuHandler = new DisableMenu();
            ClosePopup exitpopup = new ClosePopup();
            popup.LifeSpanHandler = exitpopup;
            exitpopup.close += Leavepop;
            popup.Parent = prtTabControl.SelectedTab;
            pop.Controls.Add(popup);
            popup.Dock = DockStyle.Fill;
            popup.Show();
            prtTabControl.SelectedTab = pop;
        }));
    }

拦截其他弹窗

public class ClosePopup : ILifeSpanHandler
{
    public event Action<IBrowser> close; //need to intercept javascript window.close to avoid cef.shutdown and application exit

    public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        if (close != null)
            close(browser);

        return true;
    }

    public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }

    public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
    }

    public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
    {
        browser.MainFrame.LoadUrl(targetUrl); //allow navigate in the new tabpage
        newBrowser = null;
        return true;
    }
}

如果被解雇 window.close Leavepop 退出标签页

    private void Leavepop(IBrowser obj)
    {
        Invoke(new Action(()=> {
            prtTabControl.TabPages.RemoveAt(prtTabControl.SelectedIndex);
            prtTabControl.SelectedTab = tabSito2;
        }));
    }

如何用tabpage终止supbrocess? 非常感谢。

找到了!必须处理标签页,而不是删除标签页以杀死 BrowserSubProcess.exe!