C# CefSharp DevTool的关闭按钮不起作用

发布于 2025-01-18 12:25:32 字数 3223 浏览 1 评论 0原文

我添加了以下代码以使用DevTools检查CEFSHARP浏览器中的元素,但是在打开DevTools之后,由于我的CEFSHARP浏览器称为“ Chrome”,关闭按钮不起作用

public class DevToolsMenuHandler : IContextMenuHandler
{
    public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        IMenuModel model)
    {
        model.AddItem(CefMenuCommand.CustomFirst, "Inspect");
    }

    public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        CefMenuCommand commandId, CefEventFlags eventFlags)
    {
        if (commandId != CefMenuCommand.CustomFirst) return false;

        browser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);
        return true;
    }

    public void OnContextMenuDismissed(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
    {
    }

    public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        IMenuModel model, IRunContextMenuCallback callback)
    {
        return false;
    }
}

,我试图将“ Ibrowser浏览器”更改为“ Ibrowser Chrome” ',但这无济于事,

        public partial class Form1 : Form
        {
        public ChromiumWebBrowser chrome;
        public CefSettings settings;
        string main_site = "example.com";
        public Form1()
        {
            InitializeComponent();
            InitBrowser();
        }

        public void InitBrowser()
        {
            settings = new CefSettings();
            Cef.Initialize(settings);
            textBoxUrl.Text = main_site;
            chrome = new ChromiumWebBrowser(textBoxUrl.Text);
            chrome.MenuHandler = new DevToolsMenuHandler();
            this.panel1.Controls.Add(chrome);
            chrome.Dock = DockStyle.Fill;
            chrome.AddressChanged += Chrome_AddressChanged;
        }

我在此类中也有“ mycustomlifespanhandler”中的“ webbrowser chromium web浏览器,浏览器浏览器等”这些参数/fiels也存在于“ DevToolsmenuhandler”类中。 可能是事实证明是一个名字冲突? 如何结合这些课程?

 public class MyCustomLifeSpanHandler : ILifeSpanHandler
    {
        // Load new URL (when clicking a link with target=_blank) in the same frame
        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);
            newBrowser = null;
            return true;
        }

        public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
            return true;
        }

        public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }

        public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }
    }

如何结合这些课程?

I added the following code to inspect the element in the CefSharp browser using Devtools, but after opening Devtools, the close button does not work

public class DevToolsMenuHandler : IContextMenuHandler
{
    public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        IMenuModel model)
    {
        model.AddItem(CefMenuCommand.CustomFirst, "Inspect");
    }

    public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        CefMenuCommand commandId, CefEventFlags eventFlags)
    {
        if (commandId != CefMenuCommand.CustomFirst) return false;

        browser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);
        return true;
    }

    public void OnContextMenuDismissed(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
    {
    }

    public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,
        IMenuModel model, IRunContextMenuCallback callback)
    {
        return false;
    }
}

Because of my CefSharp browser is called 'chrome', I tried to change 'iBrowser browser' to 'iBrowser chrome', but it didn't help

        public partial class Form1 : Form
        {
        public ChromiumWebBrowser chrome;
        public CefSettings settings;
        string main_site = "example.com";
        public Form1()
        {
            InitializeComponent();
            InitBrowser();
        }

        public void InitBrowser()
        {
            settings = new CefSettings();
            Cef.Initialize(settings);
            textBoxUrl.Text = main_site;
            chrome = new ChromiumWebBrowser(textBoxUrl.Text);
            chrome.MenuHandler = new DevToolsMenuHandler();
            this.panel1.Controls.Add(chrome);
            chrome.Dock = DockStyle.Fill;
            chrome.AddressChanged += Chrome_AddressChanged;
        }

I also have class "MyCustomLifeSpanHandler" in this class there are "Webbrowser chromium Web Browser, Browser browser, etc" these arguments/fiels are also present in the class "DevToolsMenuHandler".
Probably it turns out a name conflict?
How do I combine these classes?

 public class MyCustomLifeSpanHandler : ILifeSpanHandler
    {
        // Load new URL (when clicking a link with target=_blank) in the same frame
        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);
            newBrowser = null;
            return true;
        }

        public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
            return true;
        }

        public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }

        public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            // throw new NotImplementedException();
        }
    }

How do I combine these classes?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风筝有风,海豚有海 2025-01-25 12:25:32

您的ilifespanhandler实现是问题,您正在阻止devtools弹出窗口的关闭窗口。

您需要允许关闭(返回falsepopups。而不是直接实现iLifSpanHandler我建议从cefsharp.handler.lifespanhandler继承,而只是覆盖所需的方法。

chrome.LifeSpanHandler = new CustomLifeSpanHandler();

public class CustomLifeSpanHandler : CefSharp.Handler.LifeSpanHandler
{
    protected override bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        if(browser.IsPopup)
        {
            return false;
        }

        return true;
    }

    protected override 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);
        newBrowser = null;

        return true;
    }
}

Your ILifeSpanHandler implementation is the problem, you are blocking close of the DevTools Popup window.

You need to allow close (return false) for Popups. Rather than implement ILifSpanHandler directly I suggest inheriting from CefSharp.Handler.LifeSpanHandler and just override the methods you require.

chrome.LifeSpanHandler = new CustomLifeSpanHandler();

public class CustomLifeSpanHandler : CefSharp.Handler.LifeSpanHandler
{
    protected override bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        if(browser.IsPopup)
        {
            return false;
        }

        return true;
    }

    protected override 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);
        newBrowser = null;

        return true;
    }
}
汹涌人海 2025-01-25 12:25:32

尝试安装最新的 100-pre 版本。它应该在不同的版本中工作。当您遇到此类问题时,请尝试在不同版本的 CefSharp 中测试您的代码

Try to install latest 100-pre release. It should work in a different version. When you encounter such problems, try to test your code in different versions of CefSharp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文