侧边栏壁纸
博主头像
分享你我博主等级

行动起来,活在当下

  • 累计撰写 107 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

winform 使用CefSharp + vue 实现前后端交互

管理员
2020-11-02 / 0 评论 / 0 点赞 / 2 阅读 / 22366 字

CefSharp 版本: 84.4.10

    public partial class electron : Form
    {
        public electron()
        {
            Logger.Default.Info("程序启动");
            //OpenStart();
            //UpdateProgram();
            InitializeComponent();
            InitializeChromium();
        }
        public ChromiumWebBrowser chromiumBrowser;
        /// <summary>
        /// 浏览器初始化方法
        /// </summary>
        public void InitializeChromium()
        {
            CefSettings settings = new CefSettings();
            settings.IgnoreCertificateErrors = true;
            settings.LogSeverity = CefSharp.LogSeverity.Verbose;
            settings.Locale = "zh-CN";
            //必须进行初始化,否则就出来页面啦。
            CefSharp.Cef.Initialize(settings);
            //实例化控件
            chromiumBrowser = new ChromiumWebBrowser(OperationConfig.GetAppConfig("url"))
            {
                MenuHandler = new MenuHandler(),
                Dock = DockStyle.Fill
            };
            chromiumBrowser.LoadError += _webView_LoadError;
            chromiumBrowser.KeyboardHandler = new KeyBoardHander();
            //该属性就是让WebBrowser与WPF支持js交互,否则不可以建立jsObject 这个对象
            CefSharpSettings.LegacyJavascriptBindingEnabled = true;
            //注册js对象据说,79版本以上的注册方法是下面这句
            chromiumBrowser.JavascriptObjectRepository.Register("bound", new JsEvent(), false);
            // 网页加载完毕时的处理
            chromiumBrowser.FrameLoadEnd += (sender, e) =>
            {
                //string script = "alert('加载完毕!');";
                //e.Frame.ExecuteJavaScriptAsync(script);
            };
            //加入到当前窗体中
            this.Controls.Add(chromiumBrowser);
            //chromiumBrowser.ExecuteScriptAsync("");
        }
        public void _webView_LoadError(object sender, CefSharp.LoadErrorEventArgs e)
        {
            MessageBox.Show("加载页面失败,请退出客户端进行重试");
            chromiumBrowser.Dispose();
        }
    }
    /// <summary>
    /// 禁用右键菜单
    /// </summary>
    internal class MenuHandler : IContextMenuHandler
    {
        public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
        {
            model.Clear();
        }
        public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
        {
            return false;
        }
        public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
        {
        }
        public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
        {
            return false;
        }
    }
    /// <summary>
    /// 调试窗体
    /// </summary>
    public class KeyBoardHander : 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;
                switch (key)
                {
                    case Keys.F12:
                        browser.ShowDevTools();
                        break;
                    case Keys.F5:
                        if (modifiers == CefEventFlags.ControlDown)
                        {
                            //MessageBox.Show("ctrl+f5");
                            browser.Reload(true); //强制忽略缓存
                        }
                        else
                        {
                            //MessageBox.Show("f5");
                            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;
            const int VK_F5 = 0x74;
            if (windowsKeyCode == VK_F5)
            {
                browser.Reload(); //此处可以添加想要实现的代码段
            }
            return false;
        }
    }


新建一个js对象类 JsEvent 

  public class JsEvent
    {
        public string getVideo()
        {
            return "http://***.**.*/video/test.mp4";//getImageStr("F:\\test.mp4");
        }
        public string getImageStr(String path)
        {
            String contentType = "";
            try
            {
                var reg = @"[\s\S].+[\\/](.+\..+)";
                var matches = Regex.Matches(path, reg);
                //matches[0].Groups[1];
                String fileName = matches[0].Groups[1].ToString();
                String suffix = fileName.Substring(fileName.LastIndexOf(".") + 1, fileName.Length - (fileName.LastIndexOf(".") + 1));
                if ("jpg".Equals(suffix, StringComparison.CurrentCultureIgnoreCase) || "jpeg".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:image/jpeg;base64,";
                }
                else if ("png".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:image/png;base64,";
                }
                else if ("aac".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:audio/aac;base64,";
                }
                else if ("mp3".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:audio/mpeg;base64,";
                }
                else if ("wav".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:audio/x-wav;base64,";
                }
                else if ("mp4".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:video/mp4;base64,";
                }
                else if ("ogv".Equals(suffix, StringComparison.CurrentCultureIgnoreCase))
                {
                    contentType = "data:video/ogg;base64,";
                }
                using (FileStream fsRead = new FileStream(path, FileMode.Open))
                {
                    int fsLen = (int)fsRead.Length;
                    byte[] heByte = new byte[fsLen];
                    int r = fsRead.Read(heByte, 0, heByte.Length);
                    string base64Str = Convert.ToBase64String(heByte);
                    return contentType + base64Str;
                }
            }
            catch (IOException e)
            {
                throw;
            }
        }
        /// <summary>
        /// 将文件转换成二进制
        /// </summary>
        /// <param name="Path">文件路径</param>
        /// <returns></returns>
        public static byte[] ConvertToBinary(string Path)
        {
            FileStream stream = new FileInfo(Path).OpenRead();
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
            return buffer;
        }
    }

然后前端调用

bound.getVideo()

image.png

我这里主要是实现客户端视频在网页上播放所以效果如下:

代码:

<template>
    <video :src="videoSrc" controls="controls" width="500" height="400"></video>
</template>
<script>
export default {
  data() {
    return {
      videoSrc: "",
  };
  },
  created: function() {
    this.getVideoPath();
  },
  methods: {
    sdf(event, props) {
      console.log(event, props);
    },
    getVideoPath() {
      console.log(bound.getVideo());
      this.videoSrc = bound.getVideo();
    }
  }
};
</script>

效果:

image.png

0

评论区