我正在制作一个程序,只加载一个网页。用户无法访问任何其他网页,此窗体为全屏窗口,没有边框。
我使用Windows表单和CefSharp制作了一个程序,但现在我遇到了不同的问题。当我尝试登录时,这个特定的网站会显示新的弹出窗口。通常在Chrome上,它只会为此打开另一个标签页,但是在这里,它不会新建标签页,而是弹出新的弹出窗口。因此,我编写了以下代码将弹出窗口定向到新标签页,但它只会为第一个选项卡页面中的第一个弹出窗口创建新标签页。
例如,页面1打开弹出窗口,则此代码获取该弹出窗口并创建选项卡页2。直到那时,它运行得非常好,但如果选项卡页2中有弹出窗口,则它只会弹出弹出窗口,而不是创建新标签页。
我该如何解决这个问题?请帮帮忙..我认为它仅为选项卡页面1中的弹出窗口创建新标签页,并且无论从选项卡页面2中获得什么弹出窗口,它都不会打开新标签页。有没有什么方法可以解决这个问题?
我正在使用Visual Studio 2017 Winform,CefSharp Ver 67.0.0。
主类
private void initialize_browser()
{
try
{
CefSettings settings = new CefSettings();
Cef.Initialize(settings);
//main browser
chromeBrowser = new ChromiumWebBrowser("url");
LifespanHandler life = new LifespanHandler();
chromeBrowser.LifeSpanHandler = life;
life.popup_request += life_popup_request;
this.tabPage1.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
catch (Exception ex)
{
MessageBox.Show("Error in initializing the browser. Error: " + ex.Message);
}
}
private void life_popup_request(string popup_request)
{
this.Invoke((MethodInvoker)delegate ()
{
string title = "TabPage " + (tabControl1.TabCount + 1).ToString();
TabPage myTabPage = new TabPage(title);
tabControl1.TabPages.Add(myTabPage);
tabControl1.SelectTab(tabControl1.TabCount - 1);
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser(popup_request);
chromeBrowser.Parent = myTabPage;
chromeBrowser.Dock = DockStyle.Fill;
});
}
LifespanHandler Class
public class LifespanHandler : ILifeSpanHandler
{
//event that receive url popup
public event Action<string> popup_request;
bool ILifeSpanHandler.OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
{
//get url popup
if (this.popup_request != null)
this.popup_request(targetUrl);
//stop open popup
newBrowser = null;
return true;
}
bool ILifeSpanHandler.DoClose(IWebBrowser browserControl, IBrowser browser)
{ return false; }
void ILifeSpanHandler.OnBeforeClose(IWebBrowser browserControl, IBrowser browser) { }
void ILifeSpanHandler.OnAfterCreated(IWebBrowser browserControl, IBrowser browser) { }
}