C# CEFSharp WPF开发桌面程序实现“同一网站多开”
liuian 2025-05-02 19:37 8 浏览
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!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说的办法我没有试过,大家说它说得对吗?
相关推荐
- iOS9不越狱也能用:苹果Xcode 7编译安装第三方应用教程
-
在苹果iOS9正式版系统中,即使你不越狱现在也可以安装一些AppStore中根本不存在的应用程序,听上去感觉有些不可思议是吧,一起来看看这到底是怎么做到的。需要准备的东西:你需要准备一台Mac、X...
- Python+Appium控制 iOS 真机,滑动、输入、点击全搞定!
-
移动端自动化测试中,Appium+iOS测试算是门槛稍高但非常关键的一环。很多测试同学面对XCUITest+真机操作时,总觉得“设备连不上”、“控件找不到”、“滑动失败”。先看效果今天我用...
- 从零到一:用Cursor和Xcode打造你的iOS App!
-
想要开发自己的iOSApp吗?跟随我们的教程,从前期准备到App上架,一步步教你如何实现!"步骤1:开发App的前期准备"设备和软件:你需要一台Mac电脑、免费的Xcode和Curs...
- 苹果向开发者推送visionOS 2.5的第四个测试版
-
近日,苹果面向开发者正式推送了visionOS2.5的第四个Beta开发者预览版,版本号为22O5467a。开发者只需打开设备端的设置应用,在相关选项中找到“开发者测试版”开关,即可开启下...
- 苹果向开发者推送visionOS 2.5的第一个测试版
-
苹果公司近日向其注册开发者推送了visionOS2.5更新的第一个Beta测试版,版本号为22O5442g。为了安装这一测试版,开发者们只需通过VisionPro设备上的“设置”应用...
- iPhone 16 Pro Max Xcode首选,iPad Pro 2024开发利器
-
最佳开发者适配机型榜1.iPhone16ProMax(A18Pro模拟器优化)2.iPadPro2024(M4芯片多任务)3.iPhone15Pro(Xcode调试工具)4.iP...
- react native中自定义 URL Scheme并跳转到指定页面
-
在ReactNative中实现类似Android的自定义URLScheme(myapp://open)并跳转到指定页面,可以通过以下步骤完成。ReactNative提供了对深度链接(...
- 传闻暗示 iPhone 将推出桌面模式(苹果推出页面怎样才能保持推出前的状态)
-
最近,除了有关iOS视觉效果大幅重新设计和更像Mac的iPadOS体验的传闻外,还有一个有趣的传闻正在流传:iPhone可能会获得某种桌面模式。MajinBu上周写道,一些匿名消息人士称,...
- 苹果visionOS 1.3首个测试版开启推送 建议谨慎下载
-
【CNMO科技消息】据外媒报道,开发者现已能够下载体验visionOS1.3首个测试版,只需将其安装在VisionPro上即可。这一版本的发布紧随5月7日释出的第五个测试版之后,而在此之前,4月3...
- XcodeBuildMCP 让 AI 代理能够通过标准化接口与 Xcode 项目进行交互
-
项目介绍XcodeBuildMCP是一个ModelContextProtocol(MCP)服务器,提供与Xcode相关的工具,以便与AI助手和其他MCP客户端集成。它旨在通过标准化接口优化开发...
- 每日学习“Xcode”是什么呢?(xcode是开发什么的)
-
Xcode是苹果公司为macOS系统量身打造的集成开发环境(IDE),专为开发苹果生态系统内的各类应用程序,其中也包括游戏。以下从特点、安装使用、在游戏开发中的应用方面详细介绍。特点全平台支持:...
- 升级wpsjs工具包,创建和发布wps加载项
-
前一段时间wpsjs工具包不能创建、调试和发布wps加载项,目前已修复,请更新到最新版。wpsjs工具包升级到最新版可以创建和发布wps加载项。执行以下命令:npmupdate-gwpsjs...
- 如何在 TypeScript 中使用Enum(枚举)
-
在TypeScript中,枚举或枚举类型是具有一组常量值的常量长度的数据结构。这些常量值中的每一个都称为枚举的成员。在设置只能是一定数量的可能值的属性或值时,枚举很有用。一个常见的例子是一副扑克...
- Vue独立组件——11个最佳Vue.js日期选择器组件
-
介绍本文主要介绍几个Vue的时间日期选择器组件,目的在于让开发者们多一些选择,不管是从功能还是从样式,都可以选择一个适合的组件,这些组件没有绝对的好与不好,就看个人如何选择了,以下分别介绍十一个日期选...
- ABP Framework 手动升级指南:从6.0.1升级到7.0.0
-
ABP7.0.0正式版已经发布,ABP-Framework-All-In-One项目同步升级。LeptonXLiteTheme目前还没有包含在源码解决方案中,还是以Nuget包提供,目...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
-
- iOS9不越狱也能用:苹果Xcode 7编译安装第三方应用教程
- Python+Appium控制 iOS 真机,滑动、输入、点击全搞定!
- 从零到一:用Cursor和Xcode打造你的iOS App!
- 苹果向开发者推送visionOS 2.5的第四个测试版
- 苹果向开发者推送visionOS 2.5的第一个测试版
- iPhone 16 Pro Max Xcode首选,iPad Pro 2024开发利器
- react native中自定义 URL Scheme并跳转到指定页面
- 传闻暗示 iPhone 将推出桌面模式(苹果推出页面怎样才能保持推出前的状态)
- 苹果visionOS 1.3首个测试版开启推送 建议谨慎下载
- XcodeBuildMCP 让 AI 代理能够通过标准化接口与 Xcode 项目进行交互
- 标签列表
-
- 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)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)