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

C# CEFSharp WPF开发桌面程序实现“同一网站多开”

liuian 2025-05-02 19:37 48 浏览

孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!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说的办法我没有试过,大家说它说得对吗?

相关推荐

qq人工客服入口(qq人工客服详细联系方法)
  • qq人工客服入口(qq人工客服详细联系方法)
  • qq人工客服入口(qq人工客服详细联系方法)
  • qq人工客服入口(qq人工客服详细联系方法)
  • qq人工客服入口(qq人工客服详细联系方法)
手机上怎样鉴定u盘容量(手机上怎样鉴定u盘容量呢)

手机想要检测u盘的真实内存,可以首先在手机上下载一个u盘管理软件。下载完毕之后,就利用转换器连接u盘在手机的充电口。手机读取之后就可以出现现有的内存,将它导入u盘管理软件。就可以读取深层次的真实内存。...

电脑桌面图标隐藏了怎么恢复

首先长按手机应用界面空白处,在弹出的菜单中点击隐藏图标按钮,接着输入密码,可以看到被隐藏的应用,长按要恢复的应用,将它拖动到桌面即可。1、双击打开此电脑;2、点击【查看】,勾选【隐藏的项目】;3、右键...

手机如何还原到原来的系统(手机怎样恢复到原系统)
手机如何还原到原来的系统(手机怎样恢复到原系统)

可通过恢复出厂设置恢复旧版本。以oppo手机为例,具体如下:1、首先,打开手机桌面上的“设置”图标。2、点击进入之后,在跳转出来的页面中,选择“常规”页面下的“更多”选项。3、进入“更多”之后,点击选项最上面的“恢复出厂设置”选项。4、在恢...

2025-11-09 20:55 liuian

psd格式怎么编辑(psd格式怎么修改图片)

  PSD格式的图像,可以使用Photoshop来打开。  PSD--PhotoshopDocument(PSD),是著名的Adobe公司的图像处理软件Photoshop的专用格式。这种格式可以存储P...

xp系统恢复出厂设置步骤图解

电脑xp系统一键还原具体操作方法如下:1.在电脑里打开一键GHOST程序2.会看到有以前备份过的系统文件信息,默认选项是(一键恢复系统)项,点击(恢复)。3.点击(恢复)后弹出对话框,提示恢复系统必须...

联想哪款笔记本电脑最好(联想笔记本那个款好)

联想笔记本电脑有4个系列,分别是:1、昭阳笔记本电脑针对行业客户设计的高品质笔记本电脑。高端、高性能的同时具备多重可信赖的安全保护方案。昭阳系列针对行业客户提供按需定制服务。2、旭日笔记本电脑联想旭日...

测速网速在线测试(在线测速网络速度)

是指通过特定的软件或网站,对用户的网络连接速度进行测试和评估。这种测试通常包括上传速度、下载速度、延迟时间等指标,帮助用户了解自己网络连接的性能和稳定性。常见的网速在线测试网站或软件有Speedtes...

win7旗舰精简版(win7精简版系统怎么样)

Windows7SP1旗舰版64位超级极度精简封装版,属于深度精简(1G ESD版),基于Windows7SP1旗舰版进行精简优化封装,集成最新安全补丁,特别适合高主频单核、低主频...

笔记本电脑分辨率怎么调(笔记本电脑分辨率怎么调最佳win10)

调整方法如下第1步:使用快捷键【win+i】打开系统设置,也可以点击左下角的开始菜单栏,点击【设置】进入。进入系统设置后,点击【系统】,进入详细设置界面。第2步:点击左侧选项栏中的【屏幕】,在右侧找到...

显卡驱动坏了怎么修复(显卡驱动失效 哪里出问题)

1.在此电脑右击,选择管理,进入管理设备;2.在管理设备窗口选择设备管理器,进入找到显示适配器,点击显示适配器前面的>符号或者双击展开子选项;3.在显卡子选项中选择你的显卡,右击选择属...

苹果一体机双系统怎么切换(苹果一体机双系统怎么切换按哪个键)

苹果一体机双系统切换方法如下:1.在苹果电脑的桌面中点击左上角的苹果图标,等待弹出序列栏。2.在弹出的下拉选项中点击系统偏好设置进入,等待跳转页面。3.跳转页面之后,在系统偏好设置的页面中点击启动磁盘...

2025爱奇艺vip激活码(爱奇艺会员官方激活码)

2022爱奇艺腾讯优酷会员,要根据具体的需求来选择。喜欢青春偶像剧类型的可以选择爱奇艺视频;喜欢一些自制综艺和自制剧的优酷视频会员是不错的选择;腾讯视频定位就是主打大IP剧和一些热门综艺的转播,一...

安卓系统强制卸载工具(安卓 强制卸载)
  • 安卓系统强制卸载工具(安卓 强制卸载)
  • 安卓系统强制卸载工具(安卓 强制卸载)
  • 安卓系统强制卸载工具(安卓 强制卸载)
  • 安卓系统强制卸载工具(安卓 强制卸载)
ie浏览器手机版官网下载(ie游览器手机版下载)

如果您在使用IE浏览器时遇到无法下载的问题,以下是一些常见的解决办法:1.清除浏览器缓存:打开IE浏览器,依次点击工具(齿轮图标)->Internet选项->常规选项->...