经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C# CEFSharp WPF开发桌面程序实现“同一网站多开”
来源:cnblogs  作者:数据酷软件  时间:2023/8/2 9:18:05  对本文有异议

孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!CEFSharp,你用过么?访问同一网址实现多开怎么实现?比如我有3个淘宝店,我想同时登录维护,就像传说中的指纹浏览器那样实现cookie和session隔离?”

>

前言

大家好,我是44岁的大龄程序员码农阿峰。好久没有开发过桌面软件了,记得还是在2018年开发过winform,这次用wpf实现了CEFSharp访问同一网址实现多开。官方的示例是访问不同的网站可以互不干扰。其实搜索引擎刚开始就帮我搜到了解决办法,不过是我当时没有意识到那些文字对我有帮助。几番趟坑,才得以解决。

1)关键实现

直接上代码:

 

  1. /// <summary>
  2. /// 初始化浏览器集合
  3. /// </summary>
  4. public void InitDictionary()
  5. {
  6. foreach (ChatUser user in LocalAccount)
  7. {
  8. if (!Dict.ContainsKey(user.id))
  9. {
  10. #region 初始化ChromiumWebBrowser
  11. string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Cache\\Cache_" + user.id.ToString());
  12. if (!Directory.Exists(path))
  13. Directory.CreateDirectory(path);
  14. var setting = new RequestContextSettings()
  15. {
  16. CachePath = path,
  17. PersistSessionCookies = true,
  18. PersistUserPreferences = true
  19. };
  20. var context = new RequestContext(setting);
  21. var cookieManager = context.GetCookieManager(null);
  22. //这样设置的cookie不是全局的,只有当前browser才能访问
  23. cookieManager.SetCookie("dxl.cn", new Cookie
  24. {
  25. Name = $"cookie{user.nickname}",
  26. Value = $"cookievalue{user.nickname}",
  27. Path = path
  28. });
  29. ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser()
  30. {
  31. Address = config.AppSettings.Settings["ChatUrl"].Value,
  32. RequestContext = context,
  33. MenuHandler = new NullMenuHandler(),
  34. LifeSpanHandler = new LifeSpanHandler(),
  35. Visibility = Visibility.Hidden
  36. };
  37. chromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
  38. chromeBrowser.JavascriptObjectRepository.Register("bound", obj, false);
  39. #endregion
  40. obj.WebBrowserCallback += Obj_WebBrowserCallback;
  41. user.msgNum = null;
  42. chromeBrowser.LoadUrl(config.AppSettings.Settings["ChatUrl"].Value.Replace("login", "sso") + $"?token={user.token}");
  43. Dict.Add(user.id, chromeBrowser);
  44. mainWindow.MainGrid.Children.Add(chromeBrowser);
  45. }
  46. }
  47. AccountCountText = $"{LocalAccount.Count}/{config.AppSettings.Settings["MaxAccountCount"].Value}";
  48. if (AccountPlusVisibility != Visibility.Visible)
  49. {
  50. AccountPlusVisibility = Visibility.Hidden;
  51. }
  52. }

这是ViewModel的代码,下面是页面的

  1. <Border Grid.Row="1" BorderBrush="Transparent" Background="#f0f0f0" BorderThickness="0" >
  2. <Grid x:Name="MainGrid"/>
  3. </Border>
  1. MainGrid就是多个ChromeBrowser的父容器,在切换账户的使用显示当前账户对应的ChromeBrowser其他的隐藏。
  1. public void ChangeBrowser(object xaml_obj)
  2. {
  3. var array = xaml_obj as object[];
  4. if (array != null && array.Length == 2)
  5. {
  6. Grid mainGrid = array[0] as Grid;
  7. ChatUser user = array[1] as ChatUser;
  8. if (user != null)
  9. {
  10. CurrentBrowser = Dict[user.id];
  11. foreach (var chromeBrowser in mainGrid.Children)
  12. {
  13. if (chromeBrowser == CurrentBrowser)
  14. {
  15. ((ChromiumWebBrowser)chromeBrowser).Visibility = Visibility.Visible;
  16. }
  17. else
  18. {
  19. ((ChromiumWebBrowser)chromeBrowser).Visibility = Visibility.Hidden;
  20. }
  21. }
  22. }
  23. }
  24. }

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

 

  1. /// <summary>
  2. /// Cef 参数
  3. /// </summary>
  4. /// <returns></returns>
  5. public static CefSettings GetCefSettings()
  6. {
  7. var settings = new CefSettings
  8. {
  9. Locale = "zh-CN",
  10. 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",
  11. RemoteDebuggingPort = 8088,
  12. LogSeverity = LogSeverity.Disable,
  13. PersistSessionCookies = true,//Persistent Cookies会被保存在一个浏览器的一个子文件夹中
  14. UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
  15. IgnoreCertificateErrors = true,
  16. MultiThreadedMessageLoop = true,//让浏览器的消息循环在一个单独的线程中执行,建议设置成true,具体含义看看浏览器消息处理。
  17. WindowlessRenderingEnabled = true,//如果不开启好多用那种JSUI的控件的网站 都有问题
  18. CachePath = AppDomain.CurrentDomain.BaseDirectory + "/Cache",//缓存目录
  19. };
  20. settings.CefCommandLineArgs.Add("disable-application-cache", "1");//不要缓存
  21. settings.CefCommandLineArgs.Add("disable-gpu", "1");//去掉gpu,否则chrome显示有问题
  22. settings.CefCommandLineArgs.Add("enable-media-stream", "1"); //Enable WebRTC
  23. settings.CefCommandLineArgs.Add("proxy-auto-detect", "0");
  24. settings.CefCommandLineArgs.Add("no-proxy-server", "1");
  25. settings.CefCommandLineArgs.Add("allow-running-insecure-content", "1");
  26. //settings.CefCommandLineArgs.Add("ppapi-flash-version", "34.0.0.118"); //设置flash插件版本
  27. //string flashFilePath = Application.StartupPath + @"\Plugins\pepflashplayer.dll";
  28. //settings.CefCommandLineArgs.Add("ppapi-flash-path", flashFilePath);
  29. //settings.CefCommandLineArgs.Add("enable-system-flash", "1");
  30. settings.CefCommandLineArgs.Add("enable-npapi", "1");
  31. settings.CefCommandLineArgs.Add("ppapi-out-of-process", "1");
  32. settings.CefCommandLineArgs.Add("plugin-policy", "allow");
  33. return settings;
  34. }

 

以上是主程序进程启动时的初始化代码。

 

后记

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

 

  1. var settings = new CefSettings();
  2. settings.CefCommandLineArgs.Add("disable-extensions", "1");
  3. settings.CefCommandLineArgs.Add("disable-plugins", "1");
  4. settings.CefCommandLineArgs.Add("disable-session-storage", "1");
  5. settings.CefCommandLineArgs.Add("disable-web-security", "1");
  6. settings.CefCommandLineArgs.Add("disable-pdf-extension", "1");
  7. settings.CefCommandLineArgs.Add("disable-pdf-viewer", "1");
  8. settings.CefCommandLineArgs.Add("disable-javascript", "1");
  9. settings.CefCommandLineArgs.Add("disable-local-storage", "1");
  10. settings.CefCommandLineArgs.Add("disable-webgl", "1");
  11. settings.CefCommandLineArgs.Add("disable-geolocation", "1");
  12. settings.CefCommandLineArgs.Add("disable-default-apps", "1");
  13. settings.CefCommandLineArgs.Add("disable-remote-fonts", "1");
  14. settings.CefCommandLineArgs.Add("disable-remote-images", "1");
  15. settings.CefCommandLineArgs.Add("disable-remote-scripts", "1");
  16. settings.CefCommandLineArgs.Add("disable-remote-video", "1");
  17. settings.CefCommandLineArgs.Add("disable-remote-webaudio", "1");

  1. var browser = new ChromiumWebBrowser("https://www.example.com", settings);

 

AI说的办法我没有试过,大家说它说得对吗?

原文链接:https://www.cnblogs.com/datacool/p/17599302.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号