using CefSharp; using CefSharp.WinForms; using NLog; using POSV.Cef.Client.Properties; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace POSV.Cef.Client.ClientComm { public delegate void LoadingStateChanged(bool IsLoadStatus,string Message); public class CefUnifyBrowser { public CefUnifyBrowser(object _form) { this.InitializedCef(); this.m_webBrowser = new ChromiumWebBrowser(""); this.m_webBrowser.RegisterJsObject("_form", _form , false); this.m_webBrowser.Dock = DockStyle.Fill; this.m_webBrowser.LoadingStateChanged += M_webBrowser_LoadingStateChanged; this.m_webBrowser.LoadError += M_webBrowser_LoadError; this.m_form = _form as Control; this.m_form.Controls.Add(m_webBrowser); this.m_webBrowser.Show(); this.logger = LogManager.GetLogger(this.GetType().FullName + "【CEF操作类】"); } //================== private fields ===================== #region fields /// /// cef 浏览器组件 /// private ChromiumWebBrowser m_webBrowser = null; /// /// 主窗口 /// public Control m_form = null; /// /// 日志 /// private Logger logger = null; /// /// 加载消息 /// public string Message = string.Empty; public LoadingStateChanged LoadingStateEvent; #endregion //================== public function ======================= #region LoadCef 加载网页 /// /// 跳转 /// /// 地址 /// 类 public void LoadCef(string Url) { this.m_webBrowser.Load(Url); } #endregion #region CallbackJsfunction 调用JS函数 /// /// 调用JS函数 /// /// JS方法名 /// 方法参数 public void CallbackJsfunction(string name, string data) { this.logger.Info("CEF操作:" + name + "数据" + data); var _name = string.Format("{0}('{1}')", name, data); this.m_webBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(_name); } #endregion #region ShowDevTools 调用窗口 /// /// 调用html调用窗口 /// public void ShowDevTools() { try { if (m_webBrowser.IsBrowserInitialized) { this.m_webBrowser.ShowDevTools(); } } catch { } } #endregion #region CloseBrowser 关闭Form /// /// 关闭Form, 直接关闭窗口会到导致线程不能完全退出 /// public void CloseBrowser() { this.m_webBrowser.GetBrowser().CloseBrowser(true); this.logger.Info("关闭cef"); } #endregion #region Back 后退,保留界面状态 public void BackForm() { this.m_webBrowser.Back(); } #endregion #region Reload public void Reload() { this.m_webBrowser.Reload(); } #endregion #region ForwardForm前进,用户表单填写完后不依然保存 public void ForwardForm() { this.m_webBrowser.Forward(); } #endregion //================== private function ======================= private void M_webBrowser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { if (this.LoadingStateEvent != null) { this.LoadingStateEvent(e.Browser.IsLoading, Message); } } private void M_webBrowser_LoadError(object sender, LoadErrorEventArgs e) { logger.Info(string.Format("界面加载失败!\t\n ErrorCode:" + e.ErrorCode + "\t\n ErrorText:" + e.ErrorText + "\t\n FailedUrl:" + e.FailedUrl)); } private void InitializedCef() { if (!CefSharp.Cef.IsInitialized) { 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); } } } }