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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
}
}