C# CEFSharp WPF开发桌面程序实现“同一网站多开”
liuian 2025-05-02 19:37 42 浏览
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!CEFSharp,你用过么?访问同一网址实现多开怎么实现?比如我有3个淘宝店,我想同时登录维护,就像传说中的指纹浏览器那样实现cookie和session隔离?”
前言
大家好,我是44岁的大龄程序员码农阿峰。好久没有开发过桌面软件了,记得还是在2018年开发过winform,这次用wpf实现了CEFSharp访问同一网址实现多开。官方的示例是访问不同的网站可以互不干扰。其实搜索引擎刚开始就帮我搜到了解决办法,不过是我当时没有意识到那些文字对我有帮助。几番趟坑,才得以解决。
1)关键实现
直接上代码:
/// <summary>
/// 初始化浏览器集合
/// </summary>
public void InitDictionary()
{
foreach (ChatUser user in LocalAccount)
{
if (!Dict.ContainsKey(user.id))
{
#region 初始化ChromiumWebBrowser
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cache\\Cache_" + user.id.ToString());
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
var setting = new RequestContextSettings()
{
CachePath = path,
PersistSessionCookies = true,
PersistUserPreferences = true
};
var context = new RequestContext(setting);
var cookieManager = context.GetCookieManager(null);
//这样设置的cookie不是全局的,只有当前browser才能访问
cookieManager.SetCookie("dxl.cn", new Cookie
{
Name = #34;cookie{user.nickname}",
Value = #34;cookievalue{user.nickname}",
Path = path
});
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser()
{
Address = config.AppSettings.Settings["ChatUrl"].Value,
RequestContext = context,
MenuHandler = new NullMenuHandler(),
LifeSpanHandler = new LifeSpanHandler(),
Visibility = Visibility.Hidden
};
chromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
chromeBrowser.JavascriptObjectRepository.Register("bound", obj, false);
#endregion
obj.WebBrowserCallback += Obj_WebBrowserCallback;
user.msgNum = null;
chromeBrowser.LoadUrl(config.AppSettings.Settings["ChatUrl"].Value.Replace("login", "sso") + #34;?token={user.token}");
Dict.Add(user.id, chromeBrowser);
mainWindow.MainGrid.Children.Add(chromeBrowser);
}
}
AccountCountText = #34;{LocalAccount.Count}/{config.AppSettings.Settings["MaxAccountCount"].Value}";
if (AccountPlusVisibility != Visibility.Visible)
{
AccountPlusVisibility = Visibility.Hidden;
}
}
这是ViewModel的代码,下面是页面的
<Border Grid.Row="1" BorderBrush="Transparent" Background="#f0f0f0" BorderThickness="0" >
<Grid x:Name="MainGrid"/>
</Border>
public void ChangeBrowser(object xaml_obj)
{
var array = xaml_obj as object[];
if (array != null && array.Length == 2)
{
Grid mainGrid = array[0] as Grid;
ChatUser user = array[1] as ChatUser;
if (user != null)
{
CurrentBrowser = Dict[user.id];
foreach (var chromeBrowser in mainGrid.Children)
{
if (chromeBrowser == CurrentBrowser)
{
((ChromiumWebBrowser)chromeBrowser).Visibility = Visibility.Visible;
}
else
{
((ChromiumWebBrowser)chromeBrowser).Visibility = Visibility.Hidden;
}
}
}
}
}
以上是按点击切换浏览器的代码。
/// <summary>
/// Cef 参数
/// </summary>
/// <returns></returns>
public static CefSettings GetCefSettings()
{
var settings = new CefSettings
{
Locale = "zh-CN",
AcceptLanguageList = "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
RemoteDebuggingPort = 8088,
LogSeverity = LogSeverity.Disable,
PersistSessionCookies = true,//Persistent Cookies会被保存在一个浏览器的一个子文件夹中
UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
IgnoreCertificateErrors = true,
MultiThreadedMessageLoop = true,//让浏览器的消息循环在一个单独的线程中执行,建议设置成true,具体含义看看浏览器消息处理。
WindowlessRenderingEnabled = true,//如果不开启好多用那种JSUI的控件的网站 都有问题
CachePath = AppDomain.CurrentDomain.BaseDirectory + "/Cache",//缓存目录
};
settings.CefCommandLineArgs.Add("disable-application-cache", "1");//不要缓存
settings.CefCommandLineArgs.Add("disable-gpu", "1");//去掉gpu,否则chrome显示有问题
settings.CefCommandLineArgs.Add("enable-media-stream", "1"); //Enable WebRTC
settings.CefCommandLineArgs.Add("proxy-auto-detect", "0");
settings.CefCommandLineArgs.Add("no-proxy-server", "1");
settings.CefCommandLineArgs.Add("allow-running-insecure-content", "1");
//settings.CefCommandLineArgs.Add("ppapi-flash-version", "34.0.0.118"); //设置flash插件版本
//string flashFilePath = Application.StartupPath + @"\Plugins\pepflashplayer.dll";
//settings.CefCommandLineArgs.Add("ppapi-flash-path", flashFilePath);
//settings.CefCommandLineArgs.Add("enable-system-flash", "1");
settings.CefCommandLineArgs.Add("enable-npapi", "1");
settings.CefCommandLineArgs.Add("ppapi-out-of-process", "1");
settings.CefCommandLineArgs.Add("plugin-policy", "allow");
return settings;
}
以上是主程序进程启动时的初始化代码。
后记
WPF是数据驱动这真是比较香,做出来的程序对高DPI设备支持也好,可惜就是最后打包出来300多M老板接受不了,一番优化最后实现100M以下,奈何一搞C++的后生动作比我快,程序打包变态的小,程序性能貌似也比我的强。所以悲剧了,我最终二选一被PK下来,我的程序最终也是没有被使用。把关键代码分享出来,希望可以帮到有需求的人。
var settings = new CefSettings();
settings.CefCommandLineArgs.Add("disable-extensions", "1");
settings.CefCommandLineArgs.Add("disable-plugins", "1");
settings.CefCommandLineArgs.Add("disable-session-storage", "1");
settings.CefCommandLineArgs.Add("disable-web-security", "1");
settings.CefCommandLineArgs.Add("disable-pdf-extension", "1");
settings.CefCommandLineArgs.Add("disable-pdf-viewer", "1");
settings.CefCommandLineArgs.Add("disable-javascript", "1");
settings.CefCommandLineArgs.Add("disable-local-storage", "1");
settings.CefCommandLineArgs.Add("disable-webgl", "1");
settings.CefCommandLineArgs.Add("disable-geolocation", "1");
settings.CefCommandLineArgs.Add("disable-default-apps", "1");
settings.CefCommandLineArgs.Add("disable-remote-fonts", "1");
settings.CefCommandLineArgs.Add("disable-remote-images", "1");
settings.CefCommandLineArgs.Add("disable-remote-scripts", "1");
settings.CefCommandLineArgs.Add("disable-remote-video", "1");
settings.CefCommandLineArgs.Add("disable-remote-webaudio", "1");
var browser = new ChromiumWebBrowser("https://www.example.com", settings);
AI说的办法我没有试过,大家说它说得对吗?
相关推荐
- 超优质 Vue3+NaiveUI 后台管理AdminWord
-
#头条创作挑战赛#今天再来给大家推荐一款漂亮功能强大的Vue3中后台管理系统框架。admin-work基于Vue3+Vite2+Typescript+NavieUI搭建的一款全...
- electron-vue 项目启动动态获取配置文件中的后端服务地址
-
前言 最近的项目迭代中新增一个需求,需要在electron-vue项目打包之后,启动exe可执行程序的时候,动态获取配置文件中的baseUrl作为服务端的地址。electron可以使用n...
- Vue+Echarts可视化大屏系统前后端数据通信设计(附代码)
-
各位同学,大家好。上节课,我们介绍了可视化大屏系统后端数据库建模的方法。这节课,我们来讲解Vue与exrpess前后端通信的方法。01项目相关理论介绍1.后端解决跨域问题什么是跨域问题?跨域是指访问...
- 基于 Vue3 后台管理平台Vue3.x-Admin
-
今天给大家分享一个Vue3.0框架搭建的后台管理模板Vue3.xAdmin。vue3.x-admin使用vue3开发的后台管理系统。主要包括CSS3特效、可拖拽的div、图表、益智小游戏、vuex4...
- 基于vue3+ts+elementPlus后台管理系统VueNextAdmin
-
今天给大家分享一个适配手机、平板、pc的后台开源免费管理系统。vue-next-admin一款基于vue3+vite.js+typescript+element-plus开发的中后台管理系统平台...
- 超简 Vue3+ElementPlus 后台管理Vue3ElementAdmin
-
#头条创作挑战赛#今天给大家推荐一个超简易版的vue3后台管理系统Vue3-Element-Admin。Vue3ElementAdmin免费开源的中后台模版。基于vue3+ElementPl...
- 推荐一款超牛X的Vue3.0后台管理系统模板,我被惊艳到了
-
今天给位网友推荐一款超牛X的Vue3.0后台管理系统模板,他是基于vue3的中后台前端项目——CigoAdmin-Vue3.0。闲言少叙,直接大图。登录页面:CigoAdmin-Vue3.0为西谷开源...
- 使用Vue Query进行高级数据获取_vue 获取值
-
构建现代大规模应用程序最具挑战性的方面之一是数据获取。加载和错误状态、分页、过滤、排序、缓存等许多功能可能会增加复杂性,并经常使应用程序充满大量的样板代码。这就是VueQuery库的用途所在。它...
- vue+antd搭建后台管理界面模版_vue3.0 antd admin
-
vue+antd搭建后台管理界面模版(PC端)技术栈vue2+vuex+vue-router+webpack+ES6/7+axios+antd+阿里图标iconfont项目...
- 推荐20个开源的前端低代码项目_开源 低代码
-
本文约2500字,建议阅读9分钟本文分享几个值得学习和使用的前端低代码开源项目,更深入地了解什么是低代码。近几年,在技术领域低代码是比较热门的话题,比如阿里云推出了钉钉低代码,通过简单的拖拽、配置,即...
- vue接通后端api以及部署到服务器_vue调用后端接口axios
-
1.打开项目工程,找到config文件夹下index.js,进行以下修改dev:{//PathsassetsSubDirectory:'static',...
- 基于 Vue+Spring 前后端分离管理系统ELAdmin 附完整版源码
-
前言其实项目网上有很多了,但是教程比较详细的没多少,今天分享的项目从安装部署到代码具体功能都有很详细都说明eladmin是一款基于SpringBoot2.1.0、Jpa、SpringS...
- 一个函数抵N个公式,自定义函数提取身份证个人信息
-
Excel函数包括文本函数、统计函数、时间和日期函数、逻辑函数等14类函数,大大小小共计四百多个,虽然有如此多的函数,但也会遇到当前函数无法解决的问题,这时候就需要用到自定义函数;自定义函数:顾名思义...
- Visual Paradigm教程(一):工具栏介绍
-
工具栏位于VisualParadigm应用窗口的顶端,它集合了常用的按钮和工具,并被分为几个功能选项卡。工具栏在默认情况下是显示的,你可以通过点击不同的选项使它发生改变。项目选项New:创建一个新的...
- 11个web前端开发人员必备的在线工具,功能强大,值得收藏
-
互联网上有许多很棒的工具,使Web开发人员的工作更加轻松。在本文中,我将简要介绍我在工作中经常使用的11种工具。1.caniuse.com你是否不确定webAPI是否与特定浏览器兼容,或者是否可以...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
-
- 超优质 Vue3+NaiveUI 后台管理AdminWord
- electron-vue 项目启动动态获取配置文件中的后端服务地址
- Vue+Echarts可视化大屏系统前后端数据通信设计(附代码)
- 基于 Vue3 后台管理平台Vue3.x-Admin
- 基于vue3+ts+elementPlus后台管理系统VueNextAdmin
- 超简 Vue3+ElementPlus 后台管理Vue3ElementAdmin
- 推荐一款超牛X的Vue3.0后台管理系统模板,我被惊艳到了
- 使用Vue Query进行高级数据获取_vue 获取值
- vue+antd搭建后台管理界面模版_vue3.0 antd admin
- 推荐20个开源的前端低代码项目_开源 低代码
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)