CefSharp 73 在 WinForms 中按选项卡时关闭/处置子进程



我在选项卡控件中使用CefSharp选项卡构建了一个简单的表单。应用程序从 2 个选项卡页面开始,其中包含 2 个 URL。此站点之一可以在新标签页中打开新的弹出窗口,但关闭新标签页不会杀死父子进程。

在主方法调用中

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;
}
}

如果触发窗口.关闭 离开弹出退出标签页

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

我怎样才能用标签页杀死上肢? 非常感谢。

找到了!必须处理选项卡页,而不是删除以杀死浏览器子进程.exe!

最新更新