【问题标题】:How to add fullscreen support to a GeckoFx browser?如何为 GeckoFx 浏览器添加全屏支持?
【发布时间】:2019-02-03 23:17:37
【问题描述】:

我正在 C# .NET Windows 窗体应用程序中构建 Web 浏览器,并希望添加对全屏使用的支持(主要用于 HTML5 视频)。

这样当用户在 youtube 视频等视频上按下全屏按钮时,该视频将占据全屏。

浏览器使用 GeckoFx 控件来查看互联网。我该怎么做呢?

【问题讨论】:

    标签: c# winforms geckofx


    【解决方案1】:

    将浏览器控件的 Dock 属性设置为 Dock.Fill
    您可以获取您的程序当前显示的 Screen 大小,并使用它的 Bounds 来调整您的表单大小。

    订阅 Resize 活动。当窗体最大化时,移除边框(这也会移除标题栏),将 FormWindowState 设置回 FormWindowState.Normal (否则你不会能够使用全屏大小)然后根据需要调整大小。

    你的申请应该是DPIAware(如果没有看到here)。
    您还应该处理F11 键以允许用户最大化/规范化表单的窗口。

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using Gecko;
    using Screen = System.Windows.Forms.Screen;
    
    public partial class Form1 : Form
    {
        bool IsMaximized = false;
        bool TheaterClicked = false;
        Rectangle previousPosition = Rectangle.Empty;
        string UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0";
        public Form1()
        {
            InitializeComponent();
            Xpcom.Initialize("Firefox");
            GeckoPreferences.User["full-screen-api.enabled"] = true;
            GeckoPreferences.Default["full-screen-api.enabled"] = true;
            GeckoPreferences.User["general.useragent.override"] = UserAgent;
            GeckoPreferences.Default["general.useragent.override"] = UserAgent;
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            previousPosition = Bounds;
            geckoWebBrowser1.Navigate("[Some URL]");
            geckoWebBrowser1.GetDocShellAttribute().SetFullscreenAllowed(true);
        }
    
        private void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Maximized) { 
                SetWindowState(WindowState, false);
            }
            else if (!IsMaximized) { 
                previousPosition = Bounds;
            }
        }
    
        private void geckoWebBrowser1_DomMouseDown(object sender, DomMouseEventArgs e)
        {
            if (geckoWebBrowser1.Url.Host.Contains("youtu")) {
                GeckoHtmlElement elm = (GeckoHtmlElement)e.Target.CastToGeckoElement();
                switch (elm.ClassName)
                {
                    case "ytp-fullscreen-button ytp-button":
                        if (geckoWebBrowser1.Document.GetElementsByClassName("ytp-size-button ytp-button").FirstOrDefault() is GeckoHtmlElement theater) {
                            if (!TheaterClicked) {
                                theater.Click();
                                TheaterClicked = true;
                            }
                        }
                        break;
                    case "ytp-size-button ytp-button":
                        TheaterClicked = !TheaterClicked;
                        break;
                    default:
                        break;
                }
            }
        }
    
        private void SetWindowState(FormWindowState state, bool setSize)
        {
            if (state == FormWindowState.Maximized) {
                IsMaximized = true;
                if (setSize) previousPosition = Bounds;
                WindowState = FormWindowState.Normal;
                FormBorderStyle = FormBorderStyle.None;
                Location = Point.Empty;
                Size = Screen.FromHandle(Handle).Bounds.Size;
            }
            else {
                FormBorderStyle = FormBorderStyle.Sizable;
                Bounds = previousPosition;
                IsMaximized = false;
            }
        }
    
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            base.ProcessCmdKey(ref msg, keyData);
            if (keyData == Keys.F11) {
                SetWindowState(IsMaximized ? FormWindowState.Normal : FormWindowState.Maximized, true);
                return true;
            }
            else {
                return false;
            }
        }
    }
    

    【讨论】:

    • 谢谢,当我在浏览器的 YouTube 视频上按下全屏按钮时,如何触发这个? @吉米
    • 我更新了代码。它实现了我之前写的内容(F11 键)。当使用不同的方法更改 WindowState 时,它​​还应该有助于恢复表单大小。关于 YouTube 视频上的全屏按钮,我不知道如何获得 click,但我会找到...
    • 太棒了,谢谢!我知道如何从页面获得按钮点击,但我更关心的是何时触发 全屏 按钮点击以及如何使视频实际调整大小。
    • 再次更新。我注意到某些版本的 GeckoFx 不处理 mozFullScreen 命令(永远不会引发 FullscreenChange 事件)。尝试更新的代码:如果您使用的版本没有激活全屏模式,它会将视频设置为影院模式。也许它已经足够好了,直到这个问题得到解决。
    • 嗯,我的意思是,这发生在 Youtube 上,而不是其他 HTML5 视频播放器。
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2020-02-17
    • 2020-07-18
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多