C#做一个简单浏览器

你想拥有一个自己的浏览器么?你想实现浏览器定制吗?
是不是好难啊?
是不是的学c++各种底层绘图啊?

NO,没那么复杂,借助谷歌开源的chromium内核包个浏览器还是容易很多。

但是那是c++的内核啊,岂不是要学c++,看内核文档?

NO,也没那么复杂。有开源的C#项目,包装chromium内核为C#动态库,对C#只要引用dll后就是一个普通控件拖拽就能使用。

CefSharp开源地址

效果:
在这里插入图片描述

下载下来的包只需要C#winfrom工程引用cwber.dll就可以使用浏览器控件了
在这里插入图片描述

在这里插入图片描述

然后可以进行最傻瓜式的winform操作,把控件往页面拖就可实现一个浏览器了。
在这里插入图片描述

代码设置它的URL就可以用了
在这里插入图片描述

上面是传统点的搞法,要自己官网下载动态库和依赖包。这次用nuget引用包的方式新做一个浏览器示例。

1.先创建一个.net4.6工程,右键-引用添加buget包里搜cefsharp安装
在这里插入图片描述

2.给窗口Load事件加上下面代码测试,这样就得到了一个没有url输入的浏览器
在这里插入图片描述
在这里插入图片描述

3.然后给页面拖两个面板和一个url输入的文本框
在这里插入图片描述

4.然后改代码实现文本框回车事件,这样就为自己定制了一个简单浏览器

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace MyBrowser
{
    public partial class FrmMain : Form
    {
        /// <summary>
        /// 浏览器对象
        /// </summary>
        ChromiumWebBrowser chromeBrowser = null;

        public FrmMain()
        {
            InitializeComponent();
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            txtPath.Text = "https://www.baidu.com";
            CefSettings settings = new CefSettings();
            Cef.Initialize(settings);
            chromeBrowser = new ChromiumWebBrowser(txtPath.Text);
            panel2.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
            

        }


        /// <summary>
        /// 输入框按键
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode==Keys.Enter&& txtPath.Text!="")
            {
                chromeBrowser.LoadUrl(txtPath.Text);
            }
        }
    }
}

5.效果
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

够easy吧,带注释不到50行C#就定制一个浏览器。还可以包webkit内核的。

再其他定制随便玩

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using Sashulin;
using Sashulin.Core;
using Sashulin.common;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace LISBrowser
{
    /// <summary>
    /// 执行命令委托
    /// </summary>
    /// <param name="result"></param>
    public delegate void ExcCodeDelegate(string code);

    ///<summary  NoteObject="Class">
    /// [功能描述:LIS浏览器主页] <para/>
    /// [创建者:zlz] <para/>
    /// [创建时间:2015年5月24日] <para/>
    ///<说明>
    ///  [说明:LIS浏览器主页]<para/>
    ///</说明>
    ///<修改记录>
    ///    [修改时间:本次修改时间]<para/>
    ///    [修改内容:本次修改内容]<para/>
    ///</修改记录>
    ///<修改记录>
    ///    [修改时间:本次修改时间]<para/>
    ///    [修改内容:本次修改内容]<para/>
    ///</修改记录>
    ///</summary>
    public partial class LBMainForm : Form
    {
        /// <summary>
        /// IP信息
        /// </summary>
        private string IPStr = "";

        /// <summary>
        /// 标题信息
        /// </summary>
        private string TitleStr = "";

        //是否全屏
        private string FullScreen = ConfigurationManager.AppSettings["FullScreen"];

        //显示硬件信息
        private string ShowHardware = ConfigurationManager.AppSettings["ShowHardware"];

        /// <summary>
        /// 构造函数
        /// </summary>
        public LBMainForm()
        {
            InitializeComponent();
            //得到配置的url
            string url = ConfigurationManager.AppSettings["StartUrl"];
            if (FullScreen == "1")
            {
                this.FormBorderStyle = FormBorderStyle.None;
            }
            if (FullScreen == "2")
            {
                this.ControlBox = false;
                this.MinimizeBox = false;
                this.MaximizeBox = false;
            }

            if (ShowHardware == "1" || ShowHardware == "2" || ShowHardware == "3")
            {
                IPStr = "  当前设备编号:" + GetIpv4Str();
                this.Text = "  当前设备编号:" + GetIpv4Str() + ",启动时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                timerMian.Enabled = true;
            }
            //检测是否配置
            if (url == null || url == "")
            {
                MessageBox.Show("请在运用程序同名的config文件下配置LIS系统的启动路径!");
                return;
            }
            //打开开始页
            OpenPage(url, null, false);
            //设置线程
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        /// <summary>
        /// 获得当前机器的ip4串
        /// </summary>
        /// <returns></returns>
        private string GetIpv4Str()
        {
            IPAddress[] arrIPAddresses = Dns.GetHostAddresses(Dns.GetHostName());
            foreach (IPAddress ip in arrIPAddresses)
            {
                if (ip.AddressFamily.Equals(AddressFamily.InterNetwork))
                {
                    return ip.ToString();
                }
            }
            return string.Empty;
        }

        /// <summary>
        /// 改变图标
        /// </summary>
        private void ChangeIconByName(string name)
        {
            this.Icon = new Icon(Application.StartupPath + "\\" + name + ".ico");
        }

        /// <summary>
        /// 标题改变事件
        /// </summary>
        /// <param name="sender">事件触发者</param>
        /// <param name="e">参数</param>
        private void chromeWebBrowser_BrowserTitleChange(object sender, TitleEventArgs e)
        {
            //显示硬件信息
            string ShowHardware = ConfigurationManager.AppSettings["ShowHardware"];
            if (ShowHardware == "1")
            {
                return;
            }
            if (ShowHardware == "2" || ShowHardware == "3")
            {
                TitleStr = e.Title;
                return;
            }
            if (e.Title != "about:blank")
            {
                this.Text = e.Title;
            }
        }

        /// <summary>
        /// 委托
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="request">请求对象,没有为空</param>
        /// <param name="isNewPage">是否新开页面</param>
        delegate void NewPageListener(string url, object request, bool isNewPage);

        /// <summary>
        /// 弹出新窗口事件
        /// </summary>
        /// <param name="sender">事件触发者</param>
        /// <param name="e">参数</param>
        private void chromeWebBrowser_BrowserNewWindow(object sender, NewWindowEventArgs e)
        {
            if (this.InvokeRequired)
            {
                NewPageListener a = new NewPageListener(OpenPage);
                this.Invoke(a, new object[] { e.NewUrl, e.Request, true });
            }
            else
            {
                OpenPage(e.NewUrl, e.Request, true);
            }
        }

        /// <summary>
        /// 打开页
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="req">请求对象,没有的话为空</param>
        /// <param name="isNewPage">是否创建新页面</param>
        private void OpenPage(string url, object req, bool isNewPage)
        {
            //设置对象
            CSharpBrowserSettings settings = new CSharpBrowserSettings();
            settings.Locale = "zh-CN";
            //版本
            settings.UserAgent = "Mozilla/5.0 (Windows; 7 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19";
            //缓存路径
            settings.CachePath = @"C:\temp\caches";
            //创建浏览器对象
            ChromeWebBrowser browser = new ChromeWebBrowser();
            //绑定事件
            browser.BrowserNewWindow += new NewWindowEventHandler(chromeWebBrowser_BrowserNewWindow);
            //绑定标题改变事件
            browser.BrowserTitleChange += new TitleChangeEventHandler(chromeWebBrowser_BrowserTitleChange);
            //初始化设置
            browser.Initialize(settings);
            //如果不是新页面
            if (isNewPage == false)
            {
                this.Controls.Clear();
                this.Controls.Add(browser);
                //验证
                browser.Validate();
                //设置填满
                browser.Dock = DockStyle.Fill;
                if (!url.Contains("&"))
                {
                    browser.OpenUrl(url);
                }
                else
                {
                    browser.OpenUrl(req);
                }
                //设置Cookie路径
                browser.SetCookiePath("c:\\temp");
            }
            //创建并弹出新页面
            else
            {
                LBDialogForm form = new LBDialogForm();
                form.OpenPage(url, req, false);
                form.Show();
            }

        }

        /// <summary>
        /// 拷贝目录
        /// </summary>
        /// <param name="srcPath">源路径</param>
        /// <param name="aimPath">目标路径</param>
        private void CopyDir(string srcPath, string aimPath)
        {
            try
            {
                // 检查目标目录是否以目录分割字符结束如果不是则添加
                if (aimPath[aimPath.Length - 1] != System.IO.Path.DirectorySeparatorChar)
                {
                    aimPath += System.IO.Path.DirectorySeparatorChar;
                }
                // 判断目标目录是否存在如果不存在则新建
                if (!System.IO.Directory.Exists(aimPath))
                {
                    System.IO.Directory.CreateDirectory(aimPath);
                }
                // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
                // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
                // string[] fileList = Directory.GetFiles(srcPath);
                string[] fileList = System.IO.Directory.GetFileSystemEntries(srcPath);
                // 遍历所有的文件和目录
                foreach (string file in fileList)
                {
                    // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                    if (System.IO.Directory.Exists(file))
                    {
                        CopyDir(file, aimPath + System.IO.Path.GetFileName(file));
                    }
                    // 否则直接Copy文件
                    else
                    {
                        System.IO.File.Copy(file, aimPath + System.IO.Path.GetFileName(file), true);
                    }
                }
            }
            catch (Exception e)
            {
                throw;
            }
        }

        /// <summary>
        /// 定时器函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timerMian_Tick(object sender, EventArgs e)
        {
            if (ShowHardware == "2")
            {
                this.Text = TitleStr + IPStr + ",当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            }
            else if (ShowHardware == "3")
            {
                this.Text = IPStr + ",当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + TitleStr;
            }
            else
            {
                this.Text = IPStr + ",当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            }
        }

        /// <summary>
        /// 禁止双击标题栏事件
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (FullScreen == "2")
            {
                //拦截双击标题栏、移动窗体的系统消息
                if (m.Msg != 0xA3 && m.Msg != 0x0003 && m.WParam != (IntPtr)0xF012)
                {
                    base.WndProc(ref m);
                }
            }
            else
            {
                base.WndProc(ref m);
            }
        }
    }
}

这样的好处就是简单、可定制。缺点就是没最新浏览器好用,调试功能比较弱。然后内核在有的操作系统渲染慢。跟不上最新w3c标准。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: WPF是一种用于创建Windows桌面应用程序的技术,而CefSharp是一个针对.NET应用程序的Chromium嵌入式浏览器框架。结合使用WPF和CefSharp,我们可以创建一个自定义的浏览器应用程序。 首先,我们需要在WPF项目中添加CefSharp的引用,以便能够使用相关功能和组件。接下来,我们可以在XAML文件中创建一个WebBrowser控件,这个控件将会是我们浏览器应用程序的主要窗口。在代码中,我们可以使用CefSharp的API来配置浏览器的行为,比如加载URL、前进、后退、刷新等操作。 为了实现这些功能,我们需要编写一些C#代码。首先,我们需要初始化CefSharp的设置,并在应用程序启动时进行加载。然后,我们可以在浏览器的事件处理程序中编写代码,以响应用户的行为,例如在URL改变时加载新的页面,或在点击后退按钮时返回上一页。 此外,我们还可以通过使用CefSharp提供的API,实现一些其他的自定义功能。例如,我们可以通过JavaScript与浏览器进行交互,执行一些特定的脚本操作,或者通过注入自定义的CSS样式来修改网页的外观。 总而言之,使用WPF和CefSharp,我们可以创建一个功能强大且自定义的浏览器应用程序。通过灵活运用CefSharp的API,我们可以实现各种浏览器相关的功能,并与用户进行交互。这是一个非常有用且有趣的项目,可以满足用户对浏览器的个性化需求。 ### 回答2: WPF是一种用于创建富客户端应用程序的开发框架,而CEFSharp是基于Chromium内核的用于嵌入式浏览器的开源框架。使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。 首先,我们需要在WPF应用程序中添加CEFSharp的NuGet包。然后在XAML中创建一个WindowsFormsHost控件,用于嵌入浏览器。接下来,我们可以在代码中用CEFSharp的ChromiumWebBrowser控件来加载和显示网页。 加载一个网页非常简单,只需调用ChromiumWebBrowser的Load方法并传入网页的URL即可。此外,我们还可以注册一些事件来处理浏览器的加载完成、加载进度、错误等情况。例如,可以使用LoadEnd事件来监听页面加载完成,然后执行一些自定义逻辑。 此外,我们还可以通过调用ChromiumWebBrowser的ExecuteScriptAsync方法来在加载的网页中执行JavaScript代码。这使得我们可以通过与网页进行交互,实现一些复杂的功能。 在加载和显示网页时,我们也可以通过相关API来控制浏览器的行为,比如设置代理、禁用/启用JavaScript、禁止弹出窗口等。 总的来说,使用CEFSharp可以很方便地在WPF应用程序中嵌入浏览器功能。无论是显示网页,还是与网页进行交互,都可以通过CEFSharp轻松实现。这为开发者提供了更多的可能性,使得我们可以在WPF应用程序中创造出更加丰富和复杂的浏览器体验。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于开发Windows应用程序的框架,而CefSharp是一个基于谷歌开源项目Chromium Embedded Framework (CEF)的.NET库,它允许在WPF应用程序中嵌入一个完整的浏览器。 使用CefSharp在WPF应用程序中创建一个浏览器可以带来许多好处。首先,由于使用了Chromium的底层技术,CefSharp浏览器具有出色的跨平台兼容性和稳定性。它能够处理各种网页内容,包括HTML,CSS,JavaScript和其他多媒体元素。其次,CefSharp提供了强大的API,开发人员可以使用C#编写代码来控制浏览器的行为。这使得对浏览器的定制和扩展变得非常容易。 要在WPF中集成CefSharp浏览器,首先需要将CefSharp的NuGet包添加到项目中。然后,在需要嵌入浏览器的窗体中,可以使用XAML定义一个WebBrowser控件。接下来,在代码中初始化CefSharp,并设置WebBrowser控件的源为所需的URL或页面内容。 开发人员可以使用C#代码与嵌入的浏览器进行交互。例如,可以使用CefSharp的API执行一些常见的浏览器操作,如导航到新的URL,前进和后退浏览历史记录,或者捕获页面上的事件。此外,还可以通过JavaScript与页面进行交互,实现双向通信。 除了基本的浏览功能,CefSharp还提供了一些高级功能,如自定义页面呈现,浏览器扩展和弹出窗口管理。这些功能使得开发人员能够根据需要定制浏览器的外观和行为。 总之,使用CefSharp在WPF应用程序中创建一个浏览器是一种简单而强大的方法,可以使应用程序获得Web浏览功能,并根据需要进行自定义和扩展。无论是实现一个简单浏览器界面还是构建一个复杂的浏览器应用程序,CefSharp都能提供所需的功能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值