【发布时间】:2019-02-03 23:17:37
【问题描述】:
我正在 C# .NET Windows 窗体应用程序中构建 Web 浏览器,并希望添加对全屏使用的支持(主要用于 HTML5 视频)。
这样当用户在 youtube 视频等视频上按下全屏按钮时,该视频将占据全屏。
浏览器使用 GeckoFx 控件来查看互联网。我该怎么做呢?
【问题讨论】:
我正在 C# .NET Windows 窗体应用程序中构建 Web 浏览器,并希望添加对全屏使用的支持(主要用于 HTML5 视频)。
这样当用户在 youtube 视频等视频上按下全屏按钮时,该视频将占据全屏。
浏览器使用 GeckoFx 控件来查看互联网。我该怎么做呢?
【问题讨论】:
将浏览器控件的 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;
}
}
}
【讨论】:
click,但我会找到...
mozFullScreen 命令(永远不会引发 FullscreenChange 事件)。尝试更新的代码:如果您使用的版本没有激活全屏模式,它会将视频设置为影院模式。也许它已经足够好了,直到这个问题得到解决。