C# CefSharp OnFullScreen模式更改事件
我目前正在做一个CefSharp项目,我正在让HTML5视频在我的应用程序中全屏打开 我在互联网上搜索了关于这类事件如何运作的答案,但我还不太了解 我完成了我的winforms项目我已经完成了这一步: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
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;
}