C# CEFSharp WPF开发桌面程序实现“同一网站多开”
liuian 2025-05-02 19:37 52 浏览
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!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说的办法我没有试过,大家说它说得对吗?
相关推荐
- 电脑开机f8进不去安全模式(电脑启动按f8怎么进不了安全模式)
-
关于这个问题,可能是因为您的电脑启动过程太快,按F8的时间不够长,或者您的电脑已经设置为禁用F8键启动。您可以尝试以下方法进入安全模式:1.在Windows10中,按住Shift键,同时单击电源按...
- surface平板电脑如何重装系统
-
笔记本电脑到可以按下面的步骤进行重装系统:1.系统光盘放入光驱里。2.打开电源,然后观察屏幕的提示,在启动系统之前有按“F2进行BIOS设置。3.设置启动方式。这个设置画面就是BIOS设置。找到boo...
- 电脑分盘怎么分配空间(电脑分盘怎么分配空间取整)
-
电脑已经有系统的情况下如何实现分配硬盘容量:1、打开“我的电脑”点击进入控制面板,选择管理工具,计算机管理--储存--磁盘管理;2、删除后面分区再自己分配下,注意:警告(重新分区里面资料会全部删除,请...
- 电脑系统ghost是什么意思啊(电脑ghost有什么用)
-
原因分析:1、ghost文件损坏;2、系统分区出现错误。解决方案:1、重新下载ghost镜像文件,再次安装;2、用DiskGenius或者easybcd修复分区表后在重新安装试试。3、若上述方案无法解...
-
- 安卓软件apk安装包下载(安卓apk安装器下载)
-
1.设定-安全-未知来源-打钩。2.可能是下载的软件安装包不完整,请重新下载安装。3.可能是安装软件的版本低于现有版本、或者软件兼容性问题所导致,请更换其他版本或者其他软件再次下载安装。4.安卓手机支持的软件格式为APK,这种情况可以更换其...
-
2026-01-07 12:05 liuian
- 一千左右的笔记本电脑哪个好
-
¥1000左右,笔记本性价比最高的也就性价比之王的肯定,是联想的这种脾气吧,因为联想的笔记本的是国产的最好的这种脾气吧,他生产的笔记本那有高档中档和低端的这几种所以¥1000左右的可以买一杯联想比较性...
- 电脑截屏的快捷按键(“电脑截屏的快捷键”)
-
电脑截图快捷键是Ctrl+PrScrn。电脑上截图的方法一般有这4种方式:1、Ctrl+PrScrn使用这个组合键截屏,获得的是整个屏幕的图片;2、Alt+PrScrn这个组合键截屏,获得的结果是当...
-
- qq空间为什么打不开了怎么办
-
1、首先我们需要在自己的手机上下载并安装最新版本的QQ空间,安装完成后打开QQ空间,登录自己的账号。2、首先我们尝试打开QQ空间,打不开在手机上找到设置,点击进入设置界面,在这里我们可以对手机进行部分设置。3、进入设置界面后,我们需要在其中...
-
2026-01-07 10:55 liuian
- 联想怎么恢复系统(联想电脑系统恢复怎么操作)
-
如果电脑重新分区,安装了操作系统就无法恢复到预装系统。 安装了系统,没有做系统备份也是无法恢复的,只能够重新安装。 联想电脑的一键还原系统在需要使用的时候直接按下一键还原按键即可,系统会自动进...
- 台式机无线网卡连不上wifi怎么办
-
1、无线网卡驱动没更新或者不匹配;解决办法:开始→控制面板→系统→硬件→设备管理器→网络适配器→右击无线网卡→更新驱动程序软件→按部就班完成更新;2、无线网络服务未开通;解决办法:开始→控制面板→管理...
- 126官方邮箱登录入囗(126邮箱登录入口手机版官网)
-
126邮箱是网易的一个免费邮箱登录入口在浏览器输入:mail.126.com浏览器进入126邮箱网站之后,即可自行登录126邮箱账号。如何在手机上登录126邮箱1、打开手机,找到并打开网易邮箱软件。2...
- 耐用笔记本电脑排行(最耐用笔记本排名)
-
最耐用的笔记本电脑是联想牌子。联想绝对是最耐用的,质量最好的轻薄本,也是最好用的轻薄本之一。联想笔记本电脑的质量和做工在世界上能称第一。十大公认最耐用笔记本如下1、华硕灵耀x14第12代英特尔酷睿i...
- 固态硬盘量产工具下载(固态硬盘量产工具下载合集)
-
固态硬盘量产工具好用的依次是:SLC颗粒最好,MLC颗粒其次,TLC颗粒再次,QLC颗粒现在最次;但是颗粒也分原厂颗粒,黑片,白片;原厂最好,黑片就是淘汰下来的渣渣。slc最好寿命长速度快也最贵...
- 文件夹怎么显示隐藏的文件夹
-
查找隐藏文件夹的方式如下:1、点击桌面的“计算机”,双击打开计算机2、在计算机页面中,点开自己存储文件夹的盘,这里以c盘为例。其他盘也可以依据这样的方式进行查找。3、找到左上角的“组织”,在其下拉的菜...
- 一周热门
-
-
飞牛OS入门安装遇到问题,如何解决?
-
如何在 iPhone 和 Android 上恢复已删除的抖音消息
-
Boost高性能并发无锁队列指南:boost::lockfree::queue
-
大模型手册: 保姆级用CherryStudio知识库
-
用什么工具在Win中查看8G大的log文件?
-
如何在 Windows 10 或 11 上通过命令行安装 Node.js 和 NPM
-
威联通NAS安装阿里云盘WebDAV服务并添加到Infuse
-
Trae IDE 如何与 GitHub 无缝对接?
-
idea插件之maven search(工欲善其事,必先利其器)
-
如何修改图片拍摄日期?快速修改图片拍摄日期的6种方法
-
- 最近发表
- 标签列表
-
- 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)
