# 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
直接上代碼:
替換下這個工具類即可。
不明白的進群加好友咨詢。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。