新建WinFrom项目
新建用户控件:WebView.cs
引用相关dll
编写代码如下:
namespace ChromiumWebBrowser { public partial class WebView : UserControl { #region 初始化浏览器控件 public CefSharp.WinForms.ChromiumWebBrowser webBrower; private bool _EnableRightMenu = false; /// /// 是否启用右键菜单 /// public bool EnableRightMenu { get { return _EnableRightMenu; } set { _EnableRightMenu = value; } }
public List cookieList = null;
public bool isEnabledJWT = false;
public string path;
/// /// 初始函数 /// public WebView() { InitializeComponent(); }
/// /// 页面加载 /// /// protected override void OnLoad(EventArgs e) { base.OnLoad(e); }
#endregion
#region 加载调用
/// /// 根据路径获取页面控件_不带JS交互→(下载) /// /// public void getWebBrowserByPath(string strPath) { webBrower = new CefSharp.WinForms.ChromiumWebBrowser(strPath); webBrower.Dock = DockStyle.Fill;//填充方式 this.Controls.Add(webBrower); webBrower.DownloadHandler = new DownloadHandler();//下载文件 webBrower.MenuHandler = new MenuHandler();//右键菜单 }
/// /// 根据路径获取页面控件_不带JS交互→(下载) /// /// public virtual void SetUrl(string strPath) { webBrower = new CefSharp.WinForms.ChromiumWebBrowser(strPath); webBrower.Dock = DockStyle.Fill;//填充方式 if (!this.EnableRightMenu) webBrower.MenuHandler = new StopMenuHandler(); this.Controls.Add(webBrower); }
/// /// 根据路径获取页面控件_带JS交互→(下载) /// /// public void getWebBrowserByPathAndParam(string strPath, object obj) { this.Controls.Clear(); path = strPath; //添加安全证书验证的过滤 if (!CefSharp.Cef.IsInitialized) { var settings = new CefSettings(); //安全证书 settings.CefCommandLineArgs.Add("--ignore-urlfetcher-cert-requests", "1"); settings.CefCommandLineArgs.Add("--ignore-certificate-errors", "1"); CefSharp.Cef.Initialize(settings); }
webBrower = new CefSharp.WinForms.ChromiumWebBrowser(strPath); webBrower.Dock = DockStyle.Fill;//填充方式 this.Controls.Add(webBrower); webBrower.DownloadHandler = new DownloadHandler();//下载文件 webBrower.MenuHandler = new MenuHandler();//右键菜单 string domain = strPath.Split('/')[2].Split(':')[0].ToString(); if (cookieList != null && cookieList.Count > 0) { foreach (Cookie cookie in cookieList) { //CefSharp.Cef.GetGlobalCookieManager().SetCookieAsync(strPath, cookie); Cef.GetGlobalCookieManager().SetStoragePath(Environment.CurrentDirectory, true); var cook = Cef.GetGlobalCookieManager(); cook.SetCookieAsync(strPath, new CefSharp.Cookie { Creation = DateTime.Now, Domain = domain, Name = cookie.Name, Value = cookie.Value, Expires = DateTime.Now.AddDays(7) }); } }
//Js交互数据 webBrower.RegisterJsObject("jsObj", obj, false); }
private void WebView_SizeChanged(object sender, EventArgs e) { if (webBrower != null) { webBrower.Load(path); } }
/// /// 根据路径获取页面控件_带JS交互→(打印) /// /// /// /// public void getWebBrowserByPathAndPrint(string strPath, object obj) { this.Controls.Clear(); webBrower = new CefSharp.WinForms.ChromiumWebBrowser(strPath); webBrower.Dock = DockStyle.Fill;//填充方式 this.Controls.Add(webBrower); webBrower.DownloadHandler = new PrintHandler();//下载文件 webBrower.MenuHandler = new MenuHandler();//右键菜单
//Js交互数据 webBrower.RegisterJsObject("jsObj", obj, false);
}
#endregion
#region 设置浏览器委托 /// /// 设置浏览器控件 /// public delegate void SetWebBroserDelegate();
private void SetWebBroser(CefSharp.WinForms.ChromiumWebBrowser uc) { //if(this.Controls){} }
#endregion
#region 控件打印 /// /// 控件打印 /// public void PrintWebControle() { webBrower.Print(); }
#endregion
}
#region 下载接口重写
/// /// 下载事件 /// internal class DownloadHandler : IDownloadHandler { /// /// 下载前事件 /// /// /// /// public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback) { if (!callback.IsDisposed) { using (callback) { callback.Continue(@"C:\Users\" + System.Security.Principal.WindowsIdentity.GetCurrent().Name + @"\Downloads\" + downloadItem.SuggestedFileName,//文件下载默认路径设置 showDialog: true);//是否显示文件路径窗体 } } }
/// /// 下载修改事件 /// /// /// /// public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback) { //downloadItem.IsCancelled = false; } }
#endregion
#region 页面右键菜单接口重写 /// /// 页面右键菜单 /// internal class MenuHandler : IContextMenuHandler { private const int Cut = 26502;//剪切 private const int Copy = 26503;//复制 private const int Paste = 26504;//粘贴 private const int Delete = 26505;//删除 private const int SelectAll = 26506;//全选
private const int ShowDevTools = 26500;//显示工具箱 private const int CloseDevTools = 26501;//关闭工具箱
void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model) { model.Clear(); model.AddItem((CefMenuCommand)Cut, "剪切"); model.AddItem((CefMenuCommand)Copy, "复制"); model.AddItem((CefMenuCommand)Paste, "粘贴"); model.AddItem((CefMenuCommand)Delete, "删除"); model.AddItem((CefMenuCommand)SelectAll, "全选"); model.AddItem((CefMenuCommand)ShowDevTools, "显示工具箱"); model.AddItem((CefMenuCommand)CloseDevTools, "关闭工具箱"); }
bool IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags) {
try { switch ((int)commandId) { case Cut://剪切 browserControl.Cut(); break; case Copy://复制 browserControl.Copy(); break; case Paste://粘贴 browserControl.Paste(); break; case Delete://删除 browserControl.Delete(); break; case SelectAll://全选 browserControl.SelectAll(); break; case ShowDevTools://显示工具箱 browserControl.ShowDevTools(); break; case CloseDevTools://关闭工具箱 browserControl.CloseDevTools(); break; } } catch (Exception) { }
return false; }
void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame) {
}
bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback) { return false; } }
/// /// 禁用嵌套页面的右键菜单 /// public class StopMenuHandler : IContextMenuHandler { public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model) { model.Clear(); } public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags) { return false; } public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame) { } public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback) { return false; } }
#endregion
#region 根据下载接口重写实现打印功能→不弹预览窗口
/// /// 下载事件 /// internal class PrintHandler : IDownloadHandler { /// /// 下载前事件 /// /// /// /// public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback) { if (!callback.IsDisposed) { using (callback) { //判断要下载的文件夹是否存在,不存在则创建 string DownPath = @"C:\DownLoadFile"; if (Directory.Exists(DownPath) == false) { Directory.CreateDirectory(DownPath); } //创建文件夹后下载该文件 callback.Continue(DownPath + @"\" + downloadItem.SuggestedFileName,//文件下载默认路径设置 showDialog: false);//是否显示文件路径窗体 } } }
/// /// 下载修改事件 /// /// /// /// public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback) { if (downloadItem.IsComplete)//如果下载已经完成 { PdfDocument doc = new PdfDocument(); doc.LoadFromFile(downloadItem.FullPath); //打印下载的文件 doc.PrintDocument.Print(); //调取打印之后删除该文件 FileInfo downFile = new FileInfo(downloadItem.FullPath); downFile.Delete(); } } } #endregion
}
窗体调用方法如下所示:
namespace ChromiumWebBrowser { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
/// /// 窗体加载事件 /// /// /// private void Form1_Load(object sender, EventArgs e) { //实例化WebView控件 WebView w = new WebView(); w.Dock = DockStyle.Fill; this.pnBack.Controls.Add(w); //调用不带JS交互的生成方法 w.getWebBrowserByPath("https://www.baidu.com/"); 调用带JS交互的生成方法 //JsEvent js = new JsEvent(); //w.getWebBrowserByPathAndParam("https://127.0.0.1/test.html/", js); }
/// /// 窗体关闭事件 /// /// ///
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { try { //杀掉谷歌浏览器进程 System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("CefSharp.BrowserSubprocess"); if (ps.Length > 1) { for (int i = 1; i < ps.Length; i++) { ps[i].Kill(); } } } catch (Exception ex) { } } } }
实现效果:
右键菜单可调试页面,如下图所示:
JS 前端交互界面如下图所示:
参考链接
评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。
发表评论