百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

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是否与特定浏览器兼容,或者是否可以...