当前位置: 首页 > news >正文

Visual Studio 2019 C# winform CefSharp 中播放视频及全屏播放

VS C# winform CefSharp 浏览器控件,默认不支持视频播放,好在有大佬魔改了dll,支持流媒体视频播放。虽然找了很久,好歹还是找到了一个版本100.0.230的dll(资源放在文末)

首先创建一个项目

第二、引入CefSharp 100.0.230版本,项目--管理NuGet程序包

第三、搜索 CefSharp 找到 CefSharp.WinForms,点击,在右边找到版本 100.0.230安装

等待安装完成...

...

项目创作完成后,将三个dll(libcef.dll、libEGL.dll、libGLESv2.dll)文件复制替换到Release或者Debug内,再次生成,就支持视频播放了.

之后,会发现,无法全屏,全屏时,只能在控件内全屏。

网上找了有个叫做OnFullscreenModeChange的接口,试过,一直无法成功,最后通过曲线的方式实现了全屏,就是通过监控网页全屏的方法回调C处理。

首先C#处理全屏无边框的操作:

this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;

经过多次测试,发现,必须先去掉边框,在处理最大化,才能覆盖任务栏。

CefSharp 注入JS 判断CefSharp 内视频是否是全屏

MyWeb.ExecuteScriptAsync("document.addEventListener('fullscreenchange',function(){var isfull='nofull';if(!document.fullscreenElement){isfull='nofull'}else{isfull='full'}var ret={type:'fullscreenchange',isfull:isfull};CefSharp.PostMessage(ret)},false);document.onkeydown=function(event){if(event.keyCode==27){document.getElementsByTagName('iframe').exitFullscreen();document.exitFullscreen();var ret={type:'ExitFull',keyCode:27};CefSharp.PostMessage(ret)}};");

如果是全屏,就会返回isfull:full,C#回调判断

if (eo.isfull == "full"){this.FormBorderStyle = FormBorderStyle.None;this.WindowState = FormWindowState.Maximized;
}else{this.FormBorderStyle = FormBorderStyle.Sizable;this.WindowState = FormWindowState.Normal;
}

另外,通过注入JS返回回调,会出现不同线程错误,所以需要设置允许跨线程

Control.CheckForIllegalCrossThreadCalls = false;//允许跨线程调用
form1 = this;   //赋值

设置一个form1

public static Form1 form1;//跨线程设置

这样,就可以在按播放器的全屏时,实现全屏,另外设置按键,按Esc时退出全屏

 public class CEFKeyBoardHander : IKeyboardHandler{public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey){if (type == KeyType.KeyUp && Enum.IsDefined(typeof(Keys), windowsKeyCode)){var key = (Keys)windowsKeyCode;//   MessageBox.Show(key.ToString());switch (key){                     case Keys.Escape:if (form1.menuStrip1.Visible == false && form1.FormBorderStyle == FormBorderStyle.None && form1.WindowState == FormWindowState.Maximized){form1.menuStrip1.Visible = true;form1.FormBorderStyle = FormBorderStyle.Sizable;form1.WindowState = FormWindowState.Normal;//    browser.Reload();}break;}}return false;}public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut){return false;}}

按下Esc按键时,判断窗体是否是全屏状态,全屏状态时退出全屏,非全屏状态,不处理!

完整源码:https://download.csdn.net/download/xiaodouya87/88368735

视频DLL插件:https://download.csdn.net/download/xiaodouya87/88368657 

http://www.lryc.cn/news/178965.html

相关文章:

  • 天选之子Linux是如何发展起来的?为何对全球IT行业的影响如此之大?
  • MDK报错:Undefined symbol assert_failed报错解决策略
  • LLM - Make Causal Mask 构造因果关系掩码
  • Python函数式编程(一)概念和itertools
  • Guava限流器原理浅析
  • 第四十二章 持久对象和SQL - 用于创建持久类和表的选项
  • 集合-ArrayList源码分析(面试)
  • 跨类型文本文件,反序列化与类型转换的思考
  • ubuntu20安装nvidia驱动
  • gma 2 成书计划
  • 从零手搓一个【消息队列】项目设计、需求分析、模块划分、目录结构
  • 【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离
  • No156.精选前端面试题,享受每天的挑战和学习
  • 如何在PIL图像和PyTorch Tensor之间进行相互转换,使用pytorch进行PIL和tensor之间的数据转换
  • STM32F4X UCOSIII任务消息队列
  • 8个居家兼职,帮助自己在家搞副业
  • 管理与系统思维
  • 电死人的是电流还是电压?
  • mac 编译问题记录
  • centos 7.9同时安装JDK1.8和openjdk11两个版本
  • 【JavaEE】HTML
  • 【数据结构--八大排序】之堆排序
  • c# 中的类
  • 基于单片机的煤气泄漏检测报警装置设计
  • [导弹打飞机H5动画制作] 导弹每次飞行的随机路线制作
  • OpenCV实现FAST算法角点检测 、ORB算法特征点检测
  • 【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】
  • AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)
  • ChatGPT 在机器学习中的应用
  • 【JavaEE】锁策略