admin管理员组文章数量:1607884
4.8,vs2022,cefsharp122.1.120,2024年3月16日。
记录cefsarp的winform使用具体示例:
在Main入口点先加载初始化,初始化类 CefSettingClass 后面建立:
internal static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
CefSettingClass.InitializeCefSetting();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new netkapper());
}
//解析程序集失败,会加载对应的程序集
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
AssemblyName assemblyName = new AssemblyName(args.Name);
var assemblyAllName = assemblyName.Name + ".dll";
//加载CefSharp相关库
if (args.Name.StartsWith("CefSharp"))
{
string assemblyPath = Path.Combine(Application.StartupPath, CefSettingClass.CefLibName, assemblyAllName);
return File.Exists(assemblyPath) ? Assembly.LoadFile(assemblyPath) : null;
}
//判断程序集的区域性
if (!assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture))
{
assemblyAllName = string.Format(@"{0}\{1}", assemblyName.CultureInfo, assemblyAllName);
}
using (Stream stream = executingAssembly.GetManifestResourceStream(assemblyAllName))
{
if (stream == null) return null;
var assemblyRawBytes = new byte[stream.Length];
stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
return Assembly.Load(assemblyRawBytes);
}
}
}
建立 CefSettingClass 初始化类,初始化中修改了cefsharp的库文件目录为单一目录,这样比较简洁,只需要修改 library 目录名称即可:
class CefSettingClass
{
public const string CefLibName = "library"; //cef目录名称
/// <summary>
/// 初始化CEF的配置
/// </summary>
public static void InitializeCefSetting()
{
//这段代码一定要在new ChromiumWebBrowser之前调用
//作用是初始化浏览器的语言
string appPath = Application.StartupPath;
CefSettings settings = new CefSettings
{
//设置中文
Locale = "zh-CN",
//设置浏览器的访问头
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
//设置浏览器子程序启动路径
BrowserSubprocessPath = Path.Combine(appPath, CefLibName, "CefSharp.BrowserSubprocess.exe"),
};
//全局浏览器缓存的数据将存储在磁盘上的位置
settings.CachePath = Path.Combine(appPath, "cache");
//调试日志的目录和文件名。如果为空,则使用默认名称“debug.log”
settings.LogFile = Path.Combine(appPath, @"log\debug.log");
//禁用 USB 键盘检测 虚拟键盘
settings.CefCommandLineArgs.Add("disable-usb-keyboard-detect", "1");
//启用视频调谐
settings.CefCommandLineArgs.Add("enable-media-stream", "1");
//启用触屏事件
settings.CefCommandLineArgs.Add("touch-events", "1");
//禁用代理服务器
settings.CefCommandLineArgs.Add("no-proxy-server", "1");
//禁用浏览器使用自动代理检测
settings.CefCommandLineArgs.Add("proxy-auto-detect", "0");
//忽略显卡黑名单
settings.CefCommandLineArgs.Add("ignore-gpu-blacklist", "1");
//跨域设置
settings.CefCommandLineArgs.Add("--disable-web-security", "1");
//禁用硬件加速GPU
settings.CefCommandLineArgs.Add("disable-gpu", "1");
//禁用屏外渲染最佳性能
settings.SetOffScreenRenderingBestPerformanceArgs();
//让浏览器的消息循环在一个单独的线程中执行
settings.MultiThreadedMessageLoop = true;
//忽略 URL 获取器证书请求
settings.CefCommandLineArgs.Add("--ignore-urlfetcher-cert-requests", "1");
//忽略证书错误
settings.CefCommandLineArgs.Add("--ignore-certificate-errors", "1");
//允许不安全的本地主机
settings.CefCommandLineArgs.Add("allow-insecure-localhost", "1");
//设置浏览器可使用的最大内存值为1GB(1024)
settings.CefCommandLineArgs.Add("--js-flags", $"--max_old_space_size=1024");
//禁用渲染器中的局部光栅
settings.CefCommandLineArgs.Add("--disable-partial-raster", "1");
//当使用CPU光栅化时,禁用低分辨率平铺
settings.CefCommandLineArgs.Add("disable-low-res-tiling", "1");
//禁用GPU合成?
//setting.CefCommandLineArgs.Add("disable-gpu-compositing", "1");
//强制设置设备的缩放因子
settings.CefCommandLineArgs.Add("force-device-scale-factor", "1");
//远程调试 URL
settings.CefCommandLineArgs.Add("remote-debugging-port", "0");
//未知
settings.CefCommandLineArgs.Add("disable-features", "BlockInsecurePrivateNetworkRequests");
Cef.Initialize(settings);
}
/// <summary>
/// 注册方法,给javascript调用
/// </summary>
/// <param name="browser"></param>
public static void JavascriptObjectRepository(ref ChromiumWebBrowser browser)
{
CefSharpSettings.WcfEnabled = true;
browser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true, BindingOptions.DefaultBinder);
}
}
再到WindowsFormsApp1类里面写加载ChromiumWebBrowser的代码:
public partial class netkapper : Form
{
private ChromiumWebBrowser browser;
public netkapper()
{
browser = new ChromiumWebBrowser() { Dock = DockStyle.Fill };
CefSettingClass.JavascriptObjectRepository(ref browser);
this.Controls.Add(browser);
this.FormClosing += OnClosing;
browser.Load(@"d:\html\index.html");
InitializeComponent();
}
/// <summary>
/// 窗口关闭事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnClosing(object sender, CancelEventArgs e)
{
browser.GetBrowser().CloseBrowser(true);
}
}
/// <summary>
/// 注册的方法,方便javascript调用
/// </summary>
public class BoundObject
{
public int Add(string a)
{
MessageBox.Show("a" + a);
return 1;
}
}
下面是js调用c#方法的示例代码,由于上面是用的旧方法进行注册,所以这里不需要在js代码里面进行c#暴露接口绑定,直接调用即可。调用方法后获取返回值,这里返回的是 Promise
对象,所以支持then,catch来进行处理。
boundAsync.add("javascrip")
.then(function(a){
alert(a)
})
.catch(function(err){
alert(err)
})
版权声明:本文标题:cefsharp 使用示例代码 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728533379a1162377.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论