首页 文章

CefSharp OnFullscreenModeChange事件

提问于
浏览
1

我目前正在开发一个CefSharp项目,目前我正致力于在我的应用程序中全屏打开HTML5视频 .

我在互联网上搜索了关于这种事件如何运作的答案,我还不太了解 .

我的winforms项目我已经走到了这一步:

public partial class Form1 : Form
{
    public ChromiumWebBrowser chromeBrowser;

    public Form1()
    {
        InitializeComponent();
        InitializeChromium();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void InitializeChromium()
    {
        CefSettings settings = new CefSettings();

        Cef.Initialize(settings);

        chromeBrowser = new ChromiumWebBrowser("http://youtube.com/");

        this.Controls.Add(chromeBrowser);
        chromeBrowser.Dock = DockStyle.Fill;
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Cef.Shutdown();
    }
}

但每次我加载YouTube视频(或来自不同网站的视频)并点击"Fullscreen"按钮时,视频只会填充应用程序,而不是整个显示器屏幕 . 我想这是因为我还没有从IDisplayHandler接口实现 OnFullscreenModeChange 方法 .

在我寻找答案的过程中,我看到我可以使用一种方法来重载CefSharp的IDisplayHandler.OnFullscreenModeChange方法,如下所示:

class DisplayHandler : IDisplayHandler
{
...
    void IDisplayHandler.OnFullscreenModeChange(IWebBrowser browserControl, IBrowser browser, bool fullscreen)
    {
        var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;

        chromiumWebBrowser.InvokeOnUiThreadIfRequired(() =>
        {
            if (fullscreen)
            {
                parent = chromiumWebBrowser.Parent;

                parent.Controls.Remove(chromiumWebBrowser);

                fullScreenForm = new Form();
                fullScreenForm.FormBorderStyle = FormBorderStyle.None;
                fullScreenForm.WindowState = FormWindowState.Maximized;

                fullScreenForm.Controls.Add(chromiumWebBrowser);

                fullScreenForm.ShowDialog(parent.FindForm());
            }
            else
            {
                fullScreenForm.Controls.Remove(chromiumWebBrowser);

                parent.Controls.Add(chromiumWebBrowser);

                fullScreenForm.Close();
                fullScreenForm.Dispose();
                fullScreenForm = null;
            }
        });
    }
...
}

所以我的问题是:如何将此重载添加到我的ChromiumWebBrowser控件?

2 回答

  • 0

    请完整实现IDisplayHandler接口,如下所示:

    using CefSharp;
    using CefSharp.MinimalExample.WinForms.Controls;
    using CefSharp.WinForms;
    using System.Collections.Generic;
    using System.Windows.Forms;
    namespace FullScreen
    {
        public class DisplayHandler : IDisplayHandler
        {
            private Control parent;
            private Form fullScreenForm;
            void IDisplayHandler.OnAddressChanged(IWebBrowser browserControl, AddressChangedEventArgs addressChangedArgs)
            {
            }
            void IDisplayHandler.OnTitleChanged(IWebBrowser browserControl, TitleChangedEventArgs titleChangedArgs)
            {
            }
            void IDisplayHandler.OnFaviconUrlChange(IWebBrowser browserControl, IBrowser browser, IList<string> urls)
            {
            }
            void IDisplayHandler.OnFullscreenModeChange(IWebBrowser browserControl, IBrowser browser, bool fullscreen)
            {
                var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
                chromiumWebBrowser.InvokeOnUiThreadIfRequired(() =>
                {
                    if (fullscreen)
                    {
                        parent = chromiumWebBrowser.Parent;
                        parent.Controls.Remove(chromiumWebBrowser);
                        fullScreenForm = new Form();
                        fullScreenForm.FormBorderStyle = FormBorderStyle.None;
                        fullScreenForm.WindowState = FormWindowState.Maximized;
                        fullScreenForm.Controls.Add(chromiumWebBrowser);
                        fullScreenForm.ShowDialog(parent.FindForm());
                    }
                    else
                    {
                        fullScreenForm.Controls.Remove(chromiumWebBrowser);
                        parent.Controls.Add(chromiumWebBrowser);
                        fullScreenForm.Close();
                        fullScreenForm.Dispose();
                        fullScreenForm = null;
                    }
                });
            }
            bool IDisplayHandler.OnTooltipChanged(IWebBrowser browserControl, string text)
            {
                return false;
            }
            void IDisplayHandler.OnStatusMessage(IWebBrowser browserControl, StatusMessageEventArgs statusMessageArgs)
            {
            }
            bool IDisplayHandler.OnConsoleMessage(IWebBrowser browserControl, ConsoleMessageEventArgs consoleMessageArgs)
            {
                return false;
            }
        }
    }
    

    并在WinForm上使用新的displayhandler分配给ChromiumWebBrowesr,示例代码显示如下:

    public ChromiumWebBrowser WebBrowser2;  
    public Form1()
    {
      InitializeComponent();
      DisplayHandler displayer = new DisplayHandler();
      WebBrowser2 = new ChromiumWebBrowser("https://www.google.com");
      WebBrowser2.Dock = DockStyle.Fill;
      this.Panel1.Controls.Add(this.WebBrowser2);
      this.WebBrowser2.DisplayHandler = displayer;         
    }
    
  • 1

    我通过使用GeckoFX Web浏览器而不是使用CefSharp解决了这个问题 .

    由于版本45中的FullScreen API存在问题,我选择使用GeckoFX版本33 .

    我的解决方案

    ...
    Xpcom.Initialize(@"..\..\xulrunner");
    
    GeckoPreferences.User["full-screen-api.enabled"] = true;
    GeckoPreferences.Default["full-screen-api.enabled"] = true;
    
    geckoWebBrowser1.EnableDefaultFullscreen();
    
    geckoWebBrowser1.Navigate(url);
    
    geckoWebBrowser1.GetDocShellAttribute().SetIsBrowserInsideApp(0);
    geckoWebBrowser1.GetDocShellAttribute().SetFullscreenAllowed(true);
    ...
    

相关问题