Here's my simple test (CefSharp Winform 86.0.241)
- Code: Select all
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.IO;
using System.Threading.Tasks;
namespace Test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitializeChromium();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Cef.Shutdown();
}
public ChromiumWebBrowser browser, browser2;
public void InitializeChromium()
{
try
{
InitializeComponent();
if (!Cef.IsInitialized)
{
var cache_path = Path.Combine(Directory.GetCurrentDirectory(), @"cache");
CefSettings settings = new CefSettings()
{
CachePath = cache_path,
UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.241 Safari/537.36",
WindowlessRenderingEnabled = true,
MultiThreadedMessageLoop = true,
BrowserSubprocessPath = Path.Combine(Directory.GetCurrentDirectory(), @"CefSharp.BrowserSubprocess.exe")
};
settings.CefCommandLineArgs.Add("in-process-gpu", "1");
settings.CefCommandLineArgs.Add("enable-gpu", "1");
settings.CefCommandLineArgs.Add("enable-begin-frame-scheduling", "1");
settings.CefCommandLineArgs.Add("use-angle", "d3d11");
settings.CefCommandLineArgs.Add("enable-gpu-rasterization");
settings.CefCommandLineArgs.Add("process-per-tab");
settings.CefCommandLineArgs.Add("renderer-process-limit", "2");
Cef.EnableHighDPISupport();
CefSharpSettings.WcfEnabled = false;
Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
}
string link = "https://www.google.com";
browser = new ChromiumWebBrowser(link)
{
BrowserSettings =
{
Javascript = CefState.Enabled,
WindowlessFrameRate = 60
}
};
this.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
browser.FrameLoadEnd += Browser_FrameLoadEnd;
}
catch (Exception ex)
{
throw;
}
}
private async void Browser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
var html = await browser.GetSourceAsync();
string google = "google.com";
if (html.Contains(google))
{
var cefBrowser = browser.GetBrowser();
cefBrowser.StopLoad();
int numTabs = 3;
TabPage tab = new TabPage();
for (int i = 0; i < numTabs; i++)
{
IAsyncResult result = tabControl.BeginInvoke((MethodInvoker)async delegate
{
if (!tabControl.Visible) tabControl.Visible = true;
tab.Text = "Test";
string link2 = "https://www.bing.com/";
browser2 = new ChromiumWebBrowser(link2)
{
BrowserSettings =
{
Javascript = CefState.Enabled,
WindowlessFrameRate = 60
}
};
tabControl.Controls.Add(tab);
if (tabControl.TabCount == 0)
{
browser2.Parent = tabControl.SelectedTab;
}
else
{
tabControl.SelectTab(tabControl.TabCount - 1);
browser2.Parent = tabControl.SelectedTab;
}
tabControl.CreateControl();
browser2.Dock = DockStyle.Fill;
});
tabControl.EndInvoke(result);
await LoadPageAsync(browser2);
}
}
}
}
public static Task LoadPageAsync(IWebBrowser browser, string address = null)
{
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
EventHandler<LoadingStateChangedEventArgs> handler = null;
handler = (sender, args) =>
{
if (!args.IsLoading)
{
browser.LoadingStateChanged -= handler;
tcs.TrySetResult(true);
}
};
browser.LoadingStateChanged += handler;
if (!string.IsNullOrEmpty(address))
{
browser.Load(address);
}
return tcs.Task;
}
}
}
plus: not important, someone can tell me why LoadPageAsync in my test isn't work fine?