C# CefSharp OnFullScreen模式更改事件

C# CefSharp OnFullScreen模式更改事件,c#,html,video,fullscreen,cefsharp,C#,Html,Video,Fullscreen,Cefsharp,我目前正在做一个CefSharp项目,我正在让HTML5视频在我的应用程序中全屏打开 我在互联网上搜索了关于这类事件如何运作的答案,但我还不太了解 我完成了我的winforms项目我已经完成了这一步: public partial class Form1 : Form { public ChromiumWebBrowser chromeBrowser; public Form1() { InitializeComponent(); Ini

我目前正在做一个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视频(或来自不同网站的视频)并点击“全屏”按钮时,视频只会填满应用程序,而不是整个显示器屏幕。我想这是因为我还没有从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控件?

我使用GeckoFX web浏览器而不是CefSharp解决了这个问题

由于45版的全屏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);
...

请完全实现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;
        }
    }
}

我实现了麦克米利安的答案。工作得很好

此外,如果您想让
Esc
键在CefSharp中全屏退出,则需要实现
IKeyboardHandler
。我是这样做的:

使用CefSharp;
使用CefSharp.WinForms;
使用System.Windows.Forms;
名称空间监视
{
公共类KeyboardHandler:IKeyboardHandler
{
public bool OnKeyEvent(IWebBrowser chromiumWebBrowser、IBrowser浏览器、KeyType类型、int-windowsKeyCode、int-nativeKeyCode、CefEventFlags修饰符、bool-isSystemKey)
{
返回false;
}
public bool OnPreKeyEvent(IWebBrowser浏览器控件、IBrowser浏览器、KeyType类型、int-windowsKeyCode、int-nativeKeyCode、CefEventFlags修饰符、bool-isSystemKey、ref-bool-isKeyboardShortcut)
{
var chromiumWebBrowser=(chromiumWebBrowser)浏览器控件;
如果((键)windowsKeyCode==Keys.Escape)
{
chromiumWebBrowser.Invoke((MethodInvoker)委托
{
bool fullScreen=Screen.FromControl(chromiumWebBrowser).Bounds.Size==chromiumWebBrowser.Size;
如果(全屏)
{
chromiumWebBrowser.DisplayHandler.OnFullscreenModeChange(browserControl,browser,false);
}
});
}
返回false;
}
}
}
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;         
}