You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
6.6 KiB
C#

9 months ago
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);
}
}
}
}