首页 > 编程语言 >C# CEFSharp WCF开发桌面程序实现“同一网站多开”

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

时间:2023-08-01 22:35:21浏览次数:31  
标签:CEFSharp 程序实现 Visibility C# user chromeBrowser new path ChromiumWebBrowser

孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!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 = $"cookie{user.nickname}",
                        Value = $"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") + $"?token={user.token}");
                    Dict.Add(user.id, chromeBrowser);
                    mainWindow.MainGrid.Children.Add(chromeBrowser);
                }
            }
            AccountCountText = $"{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>
MainGrid就是多个ChromeBrowser的父容器,在切换账户的使用显示当前账户对应的ChromeBrowser其他的隐藏。
 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;
                        }
                    }
                }
            }
        }

以上是按点击切换浏览器的代码。

 

 

后记

WPF是数据驱动这真是比较香,做出来的程序对高DPI设备支持也好,可惜就是最后打包出来300多M老板接受不了,一番优化最后实现100M以下,奈何一搞C++的后生动作比我快,程序打包变态的小,程序性能貌似也比我的强。所以悲剧了,我最终二选一被PK下来,我的程序最终也是没有被使用。把关键代码分享出来,希望可以帮到有需求的人。

标签:CEFSharp,程序实现,Visibility,C#,user,chromeBrowser,new,path,ChromiumWebBrowser
From: https://www.cnblogs.com/datacool/p/17599302.html

相关文章

  • pytorch实现cnn&图像分类器
    1pytorch实现神经网络1.1定义网络从基类nn.Module继承过来,必须重载def__init__()和defforward()classNet(nn.Module):def__init__(self):#网络结构super(Net,self).__init__()#1inputimagechannel,6outputchannels,5x5squareco......
  • Flask使用sqlalchemy(1)
    Flask使用sqlalchemy(1)flask项目演示#运行步骤: 1pycharm打开项目2安装依赖:虚拟环境pipinstall-rreq.txt3在数据库创建库:movie#root用户密码不是123,改代码,两个地方4打开models.py解开注释,最上面两行注释掉,以脚本形式运行 命令行中:pythonmo......
  • macOS 虚拟桌面黑屏(转)
    转自:macOS重置虚拟桌面、macOS虚拟桌面黑屏有几次出现如图的情况,以为是iTerm的问题,但是在关闭软件,重启之后,依旧无效。后面经过网友告知,才知道是虚拟桌面的问题。为了清理这个问题,有以下两种方法法一:在终端输入以下命令,会删除虚拟桌面文件,以及重启电脑sudorm~/Library/Pr......
  • oracle坏块总结
    概念描述Oracle数据文件的坏块可以分为物理坏块(PhysicalBlockCorruptions)和逻辑坏块(LogicalBlockCorruptions)物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义。物理坏块一般是由于内存问题、OS问题、I/O子系统问题或硬件引起的。物理块损坏也可以称为介质块损坏(Media......
  • vscode学习笔记1
    官网网址:https://code.visualstudio.com/方式一:直接下载。方式二:一直往下滑,到最后,选择安装模式。(下图中系统安装模式)安装过程省略。(全部默认选择下一步,接受许可即可)安装中文语言包,并设置显示语言为中文。最后显示效果。......
  • ArcPy批量掩膜、重采样大量遥感影像
      本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件进行批量掩膜与批量重采样的操作。  首先,我们来明确一下本文的具体需求。现有一个存储有大量.tif格式遥感影像的文件夹;且其中除了.tif格式的遥感影像文件外,还具有其它格式的文件。  我们希望,依据一个已知的面要素矢......
  • c++求平均年纪
    班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。#include<cstdio>usingnamespacestd;intmain(){ intn,t; doubles; s=0;   //s储存班上同学年龄之和,初始值赋值为0 scanf("%d",&n);   for(inti=1;i<=n;++i) //循环累加班......
  • Vector Packet Processor(VPP)使用简介
    [email protected],2023DescriptionVPP的简介以及安装简介最早的VPP是由Cisco提出来的,不过现在已经开源了。FD.io的VectorPacketProcessor(VPP)是一个快速、可扩展的2-4层多平台网络协议栈,可以运行多种架构的如x86\ARM\Power架构的Li......
  • C语言 typedef 定义 struct 变量
    typedefstructnode{ datatypedata; structnode*next;}linknode,*linklist;创建单链表linklistL;//等价于structnode*L可以理解为,通过typedef,将structnode*替换为linklist当我们在使用LinkListL定义变量时,实际上就是在使用structnode*L定义变量使得以后......
  • Educational Codeforces Round 152 (Rated for Div. 2)
    Preface经典秒完SB题然后开始坐牢1h,写了个E的假算法T在24个点就不管了打lol去了妈的怎么稍微难点的题就是想不到呢A.MorningSandwich签到#include<cstdio>#include<iostream>#include<utility>#include<vector>#include<cstring>#include<cmath>#include<cstdlib>......