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!
我使用选项卡控件中的 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!