整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          C# CEFSharp WPF開發桌面程序實現“同一網站多開”

          # CEFSharp WPF開發桌面程序實現“同一網站多開”

          孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲著柜臺,點頭說:“對呀,對呀!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>
           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說的辦法我沒有試過,大家說它說得對嗎?

          實驗例子,用WPF演示,為什么是WPF,因為不想用WINFROM。

          本說明示例只做理論描述,開發操作的基本操作,本文不做敘述,請自行通過其它途徑學習。

          大致情況如下:

          1:創建好WPF項目后,首先在項目中添加包“CefSharp.WPF”,如果你習慣用WINFROM開發桌面程序,請使用包:“CefSharp.WINFROM”。WPF和WINFROM選型建議:如果你的項目,對程序外觀有所追求,建議用WPF開發,如果項目對外觀追求不高,那么winfrom開發速度確實更快。

          2:使用cefsharp加載網頁界面,需要添加引用,引用代碼:

          xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"

          3:“ChromiumWebBrowser”控件的address屬性中放置您需要加載的網頁地址,此示例只是做簡單的效果演示,故此處只用到前端代碼即可。如果您項目需要對網頁做大量的個性化處理,則可以用C#后端代碼實現。

          前端代碼如下:



          備注:CefSharp是一套基于Google瀏覽器引擎的開源框架。如果你對其有更多的想法, 請移步以下地址,了解更多用途用法。

          github開源地址:https://github.com/cefsharp/CefSharp

          本91

          直接上代碼:

          替換下這個工具類即可。

          不明白的進群加好友咨詢。


          主站蜘蛛池模板: 国精品无码一区二区三区在线蜜臀 | 99久久综合狠狠综合久久一区| 精品国产区一区二区三区在线观看| 中文字幕一区二区三匹| 人妻AV中文字幕一区二区三区| 国产成人精品第一区二区| 国产精品久久亚洲一区二区| 丰满人妻一区二区三区免费视频| 无码国产精品一区二区免费3p| 蜜芽亚洲av无码一区二区三区 | 国产精品成人一区二区三区| 久久国产香蕉一区精品| 无码一区二区三区老色鬼| 日韩精品免费一区二区三区| 综合久久一区二区三区 | 久久精品国产一区二区三区肥胖 | 中文字幕一区在线观看| 精品欧洲av无码一区二区| 日本中文一区二区三区亚洲| 日本亚洲成高清一区二区三区| 国产乱码精品一区二区三区麻豆 | 无码少妇一区二区三区| 久久青青草原一区二区| 中文字幕在线无码一区| 精品国产一区二区三区在线 | 在线观看亚洲一区二区| aⅴ一区二区三区无卡无码| 美女毛片一区二区三区四区| 亚洲片一区二区三区| 亚洲av永久无码一区二区三区| 中文字幕一区二区区免| 天堂一区二区三区在线观看| 亚洲韩国精品无码一区二区三区| 精品国产天堂综合一区在线| 精品无码AV一区二区三区不卡| 亚洲AV无码一区二三区| 国产一区在线视频观看| 国产美女视频一区| 色久综合网精品一区二区| 国产一区二区三区免费观看在线 | 亚洲爆乳精品无码一区二区三区|