|
|
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
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
/// cef统一操作类
|
|
|
/// </summary>
|
|
|
public class CefClientModule<T>
|
|
|
{
|
|
|
//================= 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
|
|
|
/// <summary>
|
|
|
/// cef 浏览器组件
|
|
|
/// </summary>
|
|
|
private ChromiumWebBrowser m_webBrowser = null;
|
|
|
/// <summary>
|
|
|
/// 主窗口
|
|
|
/// </summary>
|
|
|
public Control m_form = null;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 日志
|
|
|
/// </summary>
|
|
|
private Logger logger = null;
|
|
|
|
|
|
private string m_Message = "";
|
|
|
|
|
|
public LoadingStateChanged LoadingStateEvent;
|
|
|
#endregion
|
|
|
|
|
|
#region Event
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
//================== public function =======================
|
|
|
#region LoadCef 加载网页
|
|
|
/// <summary>
|
|
|
/// 跳转
|
|
|
/// </summary>
|
|
|
/// <param name="Url">地址</param>
|
|
|
/// <param name="function">类</param>
|
|
|
public void LoadCef<B>(string Url, B function)
|
|
|
{
|
|
|
logger.Info("初始化cef界面...");
|
|
|
|
|
|
m_webBrowser.Load(Url);
|
|
|
// m_webBrowser.RegisterJsObject("net", function, false);
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region CallbackJsfunction 调用JS函数
|
|
|
/// <summary>
|
|
|
/// 调用JS函数
|
|
|
/// </summary>
|
|
|
/// <param name="name">JS方法名</param>
|
|
|
/// <param name="data">方法参数</param>
|
|
|
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 调用窗口
|
|
|
/// <summary>
|
|
|
/// 调用html调用窗口
|
|
|
/// </summary>
|
|
|
public void ShowDevTools()
|
|
|
{
|
|
|
m_webBrowser.ShowDevTools();
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region CloseBrowser 关闭Form
|
|
|
/// <summary>
|
|
|
/// 关闭Form, 直接关闭窗口会到导致线程不能完全退出
|
|
|
/// </summary>
|
|
|
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
|
|
|
/// <summary>
|
|
|
/// 初始化cef
|
|
|
/// </summary>
|
|
|
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);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|