Как добавить полноэкранную поддержку в браузер GeckoFx? - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю веб-браузер в C # .NET Windows Form Application и хотел добавить поддержку полноэкранного использования (в основном для видео HTML5).

, чтобы при нажатии полноэкранной кнопки на видеокак и видео на YouTube, оно будет занимать весь экран.

Браузер использует элемент управления GeckoFx для просмотра веб-страниц.Как мне это сделать?

1 Ответ

0 голосов
/ 04 февраля 2019

Установите для свойства элемента управления браузера Dock значение Dock.Fill.
Вы можете получить размер Screen там, где вы сейчас программируете.отобразите и используйте Bounds для изменения размера вашей формы.

Подписаться на событие Resize.Когда Форма развернута, удалите границу (которая также удалит строку заголовка), установите FormWindowState обратно на FormWindowState.Normal (иначе вы не сможетеиспользовать полный размер экрана), а затем изменить его размер по мере необходимости.

Ваше приложение должно быть DPIAware (если оно не отображается здесь ).
Вы должны также обработать клавишу 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 = this.Bounds;
        this.geckoWebBrowser1.Navigate("[Some URL]");
        this.geckoWebBrowser1.GetDocShellAttribute().SetFullscreenAllowed(true);
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Maximized) { 
            SetWindowState(this.WindowState, false);
        }
        else if (!this.IsMaximized) { 
            this.previousPosition = this.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 (this.geckoWebBrowser1.Document.GetElementsByClassName("ytp-size-button ytp-button").FirstOrDefault() is GeckoHtmlElement theater)
                    {
                        if (this.TheaterClicked == false) {
                            theater.Click();
                            this.TheaterClicked = true;
                        }
                    }
                    break;
                case "ytp-size-button ytp-button":
                    this.TheaterClicked = !this.TheaterClicked;
                    break;
                default:
                    break;
            }
        }
    }

    private void SetWindowState(FormWindowState state, bool setSize)
    {
        if (state == FormWindowState.Maximized) {
            this.IsMaximized = true;
            if (setSize) this.previousPosition = this.Bounds;
            this.WindowState = FormWindowState.Normal;
            this.FormBorderStyle = FormBorderStyle.None;
            this.Location = Point.Empty;
            this.Size = Screen.FromHandle(this.Handle).Bounds.Size;
        }
        else {
            this.FormBorderStyle = FormBorderStyle.Sizable;
            this.Bounds = this.previousPosition;
            this.IsMaximized = false;
        }
    }

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        base.ProcessCmdKey(ref msg, keyData);
        if (keyData == Keys.F11) {
            SetWindowState(this.IsMaximized ? FormWindowState.Normal : FormWindowState.Maximized, true);
            return true;
        }
        else {
            return false;
        }
    }
}
...