最近要写一个浏览器包裹一个网站,试了各种浏览器插件,记录一下。

CefSharp直接可以NuGet,搜索CefSharp就可以,按照你要的FrameWorks版本选择它的版本,注意项目不可以是Any CPU,必须指定x86或者x64。

测试这个效果还可以,就最终用了它,设计界面如下:

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using CefSharp;
using CefSharp.WinForms;
using System.IO;namespace casicloud
{[System.Runtime.InteropServices.ComVisible(true)]public partial class mainForm : Form{[DllImport("user32.dll")]public static extern bool ReleaseCapture();[DllImport("user32.dll")]public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);private const int VM_NCLBUTTONDOWN = 0XA1;//定义鼠标左键按下private const int HTCAPTION = 2;     private string cachePath=Directory.GetCurrentDirectory() + @"\cache";private ChromiumWebBrowser browser = null;public mainForm(){if (setting.getProperty("NEEDCLEANCACHE").Equals("1")){DirectoryInfo dir = new DirectoryInfo(cachePath);FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();foreach (FileSystemInfo i in fileinfo){if (i is DirectoryInfo){DirectoryInfo subdir = new DirectoryInfo(i.FullName);try{subdir.Delete(true);}catch{}}else{try{File.Delete(i.FullName);}catch{}}}setting.setProperty("WebBrowser", "NEEDCLEANCACHE", "0");}InitializeComponent();var settings = new CefSettings();settings.CachePath = cachePath;//settings.CefCommandLineArgs.Add("disable-gpu", "1");//settings.CefCommandLineArgs.Add("no-proxy-server", "1");//settings.CefCommandLineArgs["autoplay-policy"] = "no-user-gesture-required";settings.CefCommandLineArgs.Add("enable-media-stream", "1");settings.Locale = "zh-CN";Cef.Initialize(settings);this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;}private void Form1_Load(object sender, EventArgs e){           browser = new CefSharp.WinForms.ChromiumWebBrowser("http://localhost");browser.ContextMenuStrip = contextMenu;browser.LifeSpanHandler = new OpenPageSelf();browser.MenuHandler = new MenuHandler();browser.Dock = DockStyle.Fill;browsePanel.Controls.Add(browser);}        //系统设置private void MainMenu_System_Setup_Click(object sender, EventArgs e){setup setupWin = new setup();setupWin.ShowDialog();}        //退出系统private void MainMenu_System_Quit_Click(object sender, EventArgs e){Application.Exit();}private void MainMenu_Option_Forward_Click(object sender, EventArgs e){browser.Forward();}private void MainMenu_Option_Back_Click(object sender, EventArgs e){browser.Back();}private void MainMenu_Option_Refresh_Click(object sender, EventArgs e){browser.Reload(true);}        //退出时释放对象private void mainForm_FormClosing(object sender, FormClosingEventArgs e){try{browser.Dispose();browser = null;CefSharp.Cef.Shutdown();}catch{}}private void MainMenu_Option_Clean_Click(object sender, EventArgs e){//清理缓存Cef.GetGlobalCookieManager().DeleteCookiesAsync("","");setting.setProperty("WebBrowser", "NEEDCLEANCACHE","1");if (MessageBox.Show("部分缓存文件需要重新启动后删除,是否马上重启?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes){Application.Exit();System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);}            }private void toolStrip1_Paint(object sender, PaintEventArgs e){if ((sender as ToolStrip).RenderMode == ToolStripRenderMode.System){Rectangle rect = new Rectangle(0, 0, this.toolStrip1.Width, this.toolStrip1.Height - 2);e.Graphics.SetClip(rect);}}private void menuStrip1_Paint(object sender, PaintEventArgs e){Rectangle rect = new Rectangle(0, 0, this.menuStrip1.Width, this.menuStrip1.Height - 2);e.Graphics.SetClip(rect);}private void panel2_MouseDoubleClick(object sender, MouseEventArgs e){if (this.WindowState == FormWindowState.Maximized)this.WindowState = FormWindowState.Normal;elsethis.WindowState = FormWindowState.Maximized;}private void pictureBox2_Click(object sender, EventArgs e){if (this.WindowState == FormWindowState.Maximized)this.WindowState = FormWindowState.Normal;elsethis.WindowState = FormWindowState.Maximized;}private void pictureBox3_Click(object sender, EventArgs e){this.WindowState = FormWindowState.Minimized;}private void panel2_MouseDown(object sender, MouseEventArgs e){//为当前应用程序释放鼠标捕获ReleaseCapture();//发送消息 让系统误以为在标题栏上按下鼠标SendMessage((IntPtr)this.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);}private void Button_Option_Home_Click(object sender, EventArgs e){browser.Load("http://localhost");}//代码结束}
}/// <summary>
/// 在自己窗口打开链接
/// </summary>
internal class OpenPageSelf : ILifeSpanHandler
{public bool DoClose(IWebBrowser browserControl, IBrowser browser){return false;}public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser){}public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser){}public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl,
string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture,
IWindowInfo windowInfo, ref bool noJavascriptAccess, out IWebBrowser newBrowser){newBrowser = null;var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;chromiumWebBrowser.Load(targetUrl);return true;}
}/// <summary>
/// 禁用右键菜单
/// </summary>
internal class MenuHandler : IContextMenuHandler
{public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser,
IFrame frame, IContextMenuParams parameters, IMenuModel model){model.Clear();model.AddItem((CefMenuCommand)26501, "前进");model.AddItem((CefMenuCommand)26502, "后退");model.AddSeparator();//添加分隔符model.AddItem((CefMenuCommand)26503, "刷新");}public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){if (commandId == (CefMenuCommand)26501){browser.GoForward();return true;}if (commandId == (CefMenuCommand)26502){browser.GoBack();return true;}if (commandId == (CefMenuCommand)26503){browser.Reload(true);return true;}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;}
}

这个代码有几个功能:

1、无边框,可拖动什么的,主要是原始窗口太丑,然后菜单什么的还有个白框,都改写了Paint;

2、禁止它的默认菜单,加了自定义菜单项(internal class MenuHandler);

3、全部在新窗口打开(internal class OpenPageSelf);

坑:

不能播放Mp4视频什么的,网上花钱下载了几个编译的插件,不知道是我的水平还是对方不行,不是编译不过,就是各种报错。

还试了一个火狐内核的Geckofx,需要什么xulrunner,配了半天也没调过,各种报错,放弃了。

就是这样。

PS:部署到客户端(Win7,X64)报了一个C:\Windows\syswow64\KERNELBASE.dll的异常代码: 0xe0434352的错误,这个我这里是缺少vc_redist.x64.exe,下载VCredist 2013.x64.exe装上就好了,我用的CefSharp.WinForms.47.0.4,根据版本不同,可能需要下载不同的运行库。

C# 关于浏览器——CefSharp篇相关推荐

  1. 前端面试题之浏览器原理篇

    前端面试题之浏览器原理篇 一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 (2)攻击类型 2. 如何防御 XSS 攻击? 3. 什么是 CSRF 攻击? (1)概念 (2)攻击类型 4. 如 ...

  2. 如何定制一款12306抢票浏览器——完结篇

    差不多花了一个星期的业余时间去完成了相关的编码.最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下.其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-oc ...

  3. python3+selenium4自动化测试操作启动不同的浏览器-基础篇2

    通过 WebDrver,Selenium 支持市场上的主要浏览器,但并不是所有的浏览器都能获得官方支持,主要支持的浏览器有Chrome(ium).Firefox. Edge. Internet Exp ...

  4. GitHub下载加速-浏览器插件篇(一)

    GitHub下载加速(浏览器插件) 插件推荐一 (一)chrome 应用商店获取安装 (二)直接(离线)安装 插件一 使用教程 插件推荐二 (一)chrome 应用商店获取安装 (二)直接(离线)安装 ...

  5. 前端面试之浏览器原理篇

    一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击.攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie ...

  6. 国外 android 手机,Android手机浏览器(国外篇)横向对比评测

    第1页:浏览器外观对比(1) 第2页:浏览器外观对比(2) 第3页:浏览器内置地址栏输入对比(1) 第4页:浏览器内置地址栏输入对比(2) 第5页:浏览器性能对比(1) 第6页:浏览器性能对比(2) ...

  7. 关于图片onload事件兼容性处理, 谷歌浏览器版本 56.0.2896.3 (64-bit) 微信客户端浏览器 canvas篇

    关于图片onload事件兼容性处理 阐述: 一个小demo,关于canvas 绘制 大转盘 和 指针,当同时各自添加onload事件指针图片突发性不显示. 兼容性问题-浏览器版本: 谷歌浏览器版本 5 ...

  8. 浏览器兼容性篇-vue篇-ES6转ES5

    在 vue 项目中,ie浏览器识别ES5写法的javascript代码,而IE浏览器不支持,所以需要借助插件 babel-polyfill ,解决方案如下: vue-cli2下 解决浏览器兼容性问题 ...

  9. [web安全]黑客攻防技术宝典-浏览器实战篇--钓鱼攻击

    钓鱼攻击是获得用户敏感信息的一种方法.钓鱼攻击的目标通常是在线银行用户.PayPal.eBay等. 主要形式: 1.电子邮件钓鱼 群发邮件,欺骗用户点击恶意的链接或附件,获取有价值的信息. 2.网站钓 ...

  10. C# 关于浏览器——WebBrowser篇

    最近要写一个浏览器包裹一个网站,试了各种浏览器插件,记录一下. 第一个就是微软的WebBrowser,这个很容易,直接拖过来,然后写一下注册表调用IE11的内核显示,这个代码是抄的: /// < ...

最新文章

  1. vdi voi idv区别_VDI,IDV,VOI究竟有何不同
  2. hs_err_pid
  3. Windows Powershell的一些常规操作命令
  4. 先序、中序确定二叉树
  5. 好用又被遗忘的Char,String 方法
  6. JAVA多线程共享变量的可见性
  7. Android定制组件之图文展示之中国好声音
  8. 马里兰大学calce电池循环测试数据集_锂电池极片:机械性能测试是门学问,要搞懂真不容易...
  9. iOS 打包流程教程
  10. HDU - 3237 Help Bubu (好题)
  11. java 错误代码1603_java更新时出现错误代码1603的解决方法
  12. Entry name ‘META-INF/xxxxxxxx‘ collided 解决方法
  13. ffmpeg实战教程(五)libswscale,libavfilter实践指南
  14. 语音信号处理之语音特征提取(1)机器学习的语音处理
  15. 【文献阅读】受山体阴影影响的冰湖制图方法研究(Li JunLi等人,2018.09,IJRS)
  16. 微信小程序 之radio应用实例(选择收货地址)
  17. Not Found The requested URL /admin/index was not found on this server.
  18. 七年级计算机考试知识点,七年级语文重点笔记 必考知识
  19. 22春天津大学《钢结构设计原理》在线作业2
  20. wireshark分析arp攻击

热门文章

  1. 性能测试--11Beanshell的脚本开发技术
  2. 初级软考程序员不会c语言,初级程序员考试就这么简单
  3. 计算机电源高频干扰,开关电源中电磁干扰的透彻分析及其解决办法
  4. concurrent包的实现示意图
  5. 中小企业信息网络安全解决方案
  6. 时间序列计量经济学模型
  7. 日期时间类-Date,Calendar和日期格式化
  8. WordPress小程序源码 社区论坛小程序源码 知识付费商城小程序下载
  9. kindeditor编辑器一键保存远程图片
  10. vulnhub-Odin