gpt4 book ai didi

c# - cefsharp 弹出到 newtab。二级弹出窗口的问题

转载 作者:行者123 更新时间:2023-12-05 07:29:01 56 4
gpt4 key购买 nike

我正在制作一个只加载一个网页的程序。用户无法访问任何其他网页,并且此窗口窗体是全屏的,没有边框。

我设法使用 Windows 窗体和 cefsharp 制作了一个,但现在我遇到了不同的问题。当我尝试登录时,这个特定网站会显示新的弹出窗口。通常在 chrome 上,它只是为此打开另一个选项卡,但在这里,它不会创建新选项卡,而是打开新的弹出窗口。所以我编写了代码将弹出窗口定向到 newtab,如下所示,但它只为第一个标签页的第一个弹出窗口创建新标签。

例如,第 1 页打开弹出窗口,然后此代码采用该弹出窗口并创建 tabPage 2。到那时它工作正常,但如果 tabPage2 中有弹出窗口,它只会打开弹出窗口而不是创建新选项卡。

我该如何解决这个问题?请帮忙.. 我认为它正在创建新选项卡,仅用于从 tabPage1 弹出以及从 tabPage2 获得的任何弹出窗口,它不会打开新选项卡。有没有办法解决这个问题并修复它?

我在 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 类

 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) { }
}

最佳答案

我遇到了同样的问题,所以我解决了它。

  1. 您应该将变量 Life 声明为全局变量LifespanHandler life = new LifespanHandler();

  2. 在 life_popup_request 函数中添加:chromeBrowser.LifeSpanHandler = life;

    private void life_popup_request(string popup_request){这个。调用((MethodInvoker)委托(delegate)(){字符串标题 = "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.LifeSpanHandler = life;

    chromeBrowser.Parent = myTabPage;

    chromeBrowser.Dock = DockStyle.Fill;
    });

祝你好运!

关于c# - cefsharp 弹出到 newtab。二级弹出窗口的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53040021/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com