using CefSharp; using CefSharp.WinForms; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using Newtonsoft.Json; namespace POSV.Cef.Client.ClientComm { /// /// cef统一操作类 /// public class CefClientModule { //================= construct function ================== #region construct function public CefClientModule(T _form) { this.m_form = _form as Control; this.logger = LogManager.GetLogger(this.GetType().FullName + "【CEF操作类】"); this.InitializeCefSettings(); var Url = this.ModuleFilter(_form); m_webBrowser = new ChromiumWebBrowser(Url); logger.Info("----------------------------------" + _form.ToString()); m_webBrowser.LoadingStateChanged += M_webBrowser_LoadingStateChanged; m_webBrowser.LoadError += M_webBrowser_LoadError; m_webBrowser.FrameLoadEnd += M_webBrowser_FrameLoadEnd; this.InitializeCefClient(); } private void M_webBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e) { var s = e.HttpStatusCode; var a = e.Url; var b = e.Browser.CanGoBack; try { //if (m_webBrowser.IsBrowserInitialized) //{ // m_webBrowser.ShowDevTools(); //} //else //{ // // MessageBox.Show("cef内部代码错误 "); //} } catch (Exception ex) { // MessageBox.Show("这个是调试代码,调用cef调用窗口时出现异常:\t\n" + e.Message); } } private void M_webBrowser_LoadError(object sender, LoadErrorEventArgs e) { this.m_Message = e.ErrorText; logger.Info("cef加载错误:" + e.ErrorText); } #endregion //================== private fields ===================== #region fields /// /// cef 浏览器组件 /// private ChromiumWebBrowser m_webBrowser = null; /// /// 主窗口 /// public Control m_form = null; /// /// 日志 /// private Logger logger = null; private string m_Message = ""; public LoadingStateChanged LoadingStateEvent; #endregion #region Event #endregion //================== public function ======================= #region LoadCef 加载网页 /// /// 跳转 /// /// 地址 /// 类 public void LoadCef(string Url, B function) { logger.Info("初始化cef界面..."); m_webBrowser.Load(Url); // m_webBrowser.RegisterJsObject("net", function, false); } #endregion #region CallbackJsfunction 调用JS函数 /// /// 调用JS函数 /// /// JS方法名 /// 方法参数 public void CallbackJsfunction(string name, string data) { logger.Info("CEF操作:" + name + "数据" + data); string _name = string.Empty; if (data == null) { _name = string.Format("{0}()", name); } else { _name = string.Format("{0}('{1}')", name, data); } m_webBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(_name); } #endregion #region ShowDevTools 调用窗口 /// /// 调用html调用窗口 /// public void ShowDevTools() { m_webBrowser.ShowDevTools(); } #endregion #region CloseBrowser 关闭Form /// /// 关闭Form, 直接关闭窗口会到导致线程不能完全退出 /// public void CloseBrowser() { this.m_webBrowser.GetBrowser().CloseBrowser(true); logger.Info("关闭cef"); } #endregion //================== private function ====================== #region InitializeCefClient 初始化cef浏览器显示 private void InitializeCefClient() { m_webBrowser.Dock = DockStyle.Fill; this.m_form.Controls.Add(m_webBrowser); m_webBrowser.RegisterJsObject("net", m_form, false); } #endregion #region 初始化 cef /// /// 初始化cef /// private void InitializeCefSettings() { var settings = new CefSettings(); // 在配置类中注册自定义的schemeName与其对应的工厂类 settings.RegisterScheme( new CefCustomScheme { SchemeName = CustomSchemeHandlerFactory.SchemeName, SchemeHandlerFactory = new CustomSchemeHandlerFactory() }); //设置是否使用代理服务 settings.CefCommandLineArgs.Add("no-proxy-server", "1"); settings.CefCommandLineArgs.Add("disable-gpu-compositing", "1"); settings.CefCommandLineArgs.Add("enable-begin-frame-scheduling", "1"); settings.CefCommandLineArgs.Add("disable-gpu-vsync", "1"); settings.CefCommandLineArgs.Add("disable-direct-write", "1"); //初始化 CefSharp.Cef.Initialize(settings); } #endregion private string ModuleFilter(T function) { var _name = function.GetType().Name; var _Url = "custom://suibiantian/404.html"; switch (_name) { case "FastTemplate": _Url = "custom://suibiantian/FastMain.html"; break; default: _Url = "custom://suibiantian/404.html"; break; } return _Url; } private void M_webBrowser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { if (this.LoadingStateEvent != null) { this.LoadingStateEvent(e.Browser.IsLoading, m_Message); } } } }