【问题标题】:CefSharp OnFullscreenModeChange eventCefSharp OnFullscreenModeChange 事件
【发布时间】:2017-09-17 01:17:53
【问题描述】:

我目前正在开发一个 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 控件?

【问题讨论】:

    标签: c# html video fullscreen cefsharp


    【解决方案1】:

    请完整实现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 上使用 ChromiumWebBrowesr 分配一个新的 displayhandler,示例代码如下所示:

    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;         
    }
    

    【讨论】:

      【解决方案2】:

      我实施了 McMillian 的回答。效果很好!

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

      using CefSharp;
      using CefSharp.WinForms;
      using System.Windows.Forms;
      
      namespace WatchNow
      {
          public class KeyboardHandler : IKeyboardHandler
          {
              public bool OnKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
              {
                  return false;
              }
      
              public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
              {
                  var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
      
                  if ((Keys)windowsKeyCode == Keys.Escape)
                  {
                      chromiumWebBrowser.Invoke((MethodInvoker)delegate 
                      {
                          bool fullScreen = Screen.FromControl(chromiumWebBrowser).Bounds.Size == chromiumWebBrowser.Size;
                          if (fullScreen)
                          {
                              chromiumWebBrowser.DisplayHandler.OnFullscreenModeChange(browserControl, browser, false);
                          }
                      });
                  }
      
                  return false;
              }
          }
      }
      
      

      【讨论】:

        【解决方案3】:

        我已经通过使用 GeckoFX 网络浏览器而不是使用 CefSharp 解决了这个问题。

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

        我的解决方案:

        ...
        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);
        ...
        

        【讨论】:

          猜你喜欢
          • 2016-08-06
          • 2017-12-18
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 2017-01-04
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          相关资源
          最近更新 更多