WinFrom嵌入谷歌内核ChromiumWebBrowser |
您所在的位置:网站首页 › android内嵌chrome内核 › WinFrom嵌入谷歌内核ChromiumWebBrowser |
新建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 前端交互界面如下图所示:
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |