https://blog.csdn.net/coolbeliever/article/details/109507780
CEF的引用
1. 通過NuGet包管理器安裝cef相應的包
2. 使用
2.1 初始化
-
static class Program
-
{
-
/// <summary>
-
/// 應用程序的主入口點。
-
/// </summary>
-
[
-
static void Main()
-
{
-
// 基本設置
-
var settings = new CefSettings()
-
{
-
//By default CefSharp will use an in-memory cache, you need to specify a Cache Folder to persist data
-
//CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache")
-
};
-
// 設置是否使用GPU
-
settings.CefCommandLineArgs.Add( "disable-gpu", "1");
-
// 設置是否使用代理服務
-
settings.CefCommandLineArgs.Add( "no-proxy-server", "1");
-
// 設置是否啟動js交互,假如需要原生與js方法互調,則需要設置為true
-
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
-
// 初始化
-
Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
-
-
Application.EnableVisualStyles();
-
Application.SetCompatibleTextRenderingDefault( false);
-
Application.Run( new SplashForm());
-
}
-
}
2.2 Form顯示頁面
-
public partial class BrowserForm: Form
-
{
-
private ChromiumWebBrowser webBrowser;
-
-
public BrowserForm()
-
{
-
InitializeComponent();
-
}
-
-
private void Form_Load(object sender, EventArgs e)
-
{
-
string path = "www.baidu.com";
-
webBrowser = new ChromiumWebBrowser(path)
-
{
-
Dock = DockStyle.Fill,
-
MenuHandler = new MenuHandler()
-
};
-
this.Controls.Add(webBrowser);
-
}
-
}
啟動程序,百度首頁就會被加載出來,一個簡單的瀏覽器就這樣實現了
3. cef的復雜使用
-
public partial class BrowserForm: Form
-
{
-
private ChromiumWebBrowser webBrowser;
-
-
public BrowserForm()
-
{
-
InitializeComponent();
-
}
-
-
private void Form_Load(object sender, EventArgs e)
-
{
-
string path = "file:///WebRes/view/answerList.html";
-
webBrowser = new ChromiumWebBrowser(path)
-
{
-
Dock = DockStyle.Fill,
-
MenuHandler = new MenuHandler()
-
};
-
this.Controls.Add(webBrowser);
-
-
webBrowser.FrameLoadEnd += WebBrowser_FrameLoadEnd;
-
webBrowser.RegisterAsyncJsObject( "answerListForm", new JsEvent(this));
-
}
-
-
private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
-
{
-
if (e.Frame.IsMain)
-
{
-
string answerMessage = JsonHelper.SerializeObject(Config.teacherSetAnswer);
-
webBrowser.ExecuteScriptAsync( "getTeacherSetAnswer(" + answerMessage + ")");
-
}
-
}
-
/*
-
* ============================================================================================
-
* JS與調用c#
-
*/
-
public class JsEvent
-
{
-
AnswerListForm form;
-
public JsEvent(AnswerListForm form)
-
{
-
this.form = form;
-
}
-
-
public void test(string message)
-
{
-
if (form != null)
-
{
-
form.test(message);
-
}
-
}
-
}
-
}
3.1 加載本地html
加載本地文件格式:file:/// + 相對路徑
3.2 去除鼠標右鍵事件
-
class MenuHandler : CefSharp.IContextMenuHandler
-
{
-
void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
-
{
-
model.Clear();
-
}
-
-
bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
-
{
-
//throw new NotImplementedException();
-
return false;
-
}
-
-
void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
-
{
-
//throw new NotImplementedException();
-
}
-
-
bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
-
{
-
return false;
-
}
-
}
在初始化瀏覽器時,添加
-
webBrowser = new ChromiumWebBrowser(path)
-
{
-
MenuHandler = new MenuHandler()
-
};
3.3 c#調用js方法時機
-
webBrowser.FrameLoadEnd += WebBrowser_FrameLoadEnd;
-
private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
-
{
-
if (e.Frame.IsMain)
-
{
-
string answerMessage = JsonHelper.SerializeObject(Config.teacherSetAnswer);
-
webBrowser.ExecuteScriptAsync( "getTeacherSetAnswer(" + answerMessage + ")");
-
}
-
}
監聽WebBrowser_FrameLoadEnd事件,在其回調后才能調用js
3.4 js調用c#方法
-
webBrowser.RegisterAsyncJsObject( "answerListForm", new JsEvent(this));
-
-
public class JsEvent
-
{
-
AnswerListForm form;
-
public JsEvent(AnswerListForm form)
-
{
-
this.form = form;
-
}
-
-
public void test(string message)
-
{
-
if (form != null)
-
{
-
form.test(message);
-
}
-
}
-
}
注入JsEvent對象,並添加注入標識符(answerListForm),在js的調用方式是:answerListForm.test(“king”);
4 CEF的一些坑
4.1 平台
目前CefSharp還不支持AnyCPU(貌似新版本開始支持:https://github.com/cefsharp/CefSharp/issues/1714),需要將你的項目設置為x86或x64
4.2 運行環境需求
- Microsoft .Net 4.5.2 or greater(4.5.2或以上)
- Microsoft Visual C++ Redistributable Package (either x86 or x64 depending on your application)(vc++運行庫)
4.3 嵌套了ChromiumWebBrowser 的form關閉
建議使用webBrowser.GetBrowser().CloseBrowser(true);方式來關閉,而不直接調用form.Close()