C#做一个简单浏览器

39 篇文章 6 订阅
订阅专栏

你想拥有一个自己的浏览器么?你想实现浏览器定制吗?
是不是好难啊?
是不是的学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标准。

C#进阶--文件操作(创建、写入、读取、删除)
weixin_45017815的博客
07-29 3351
C#文件操作,创建,读取,写入,删除
C#的一个简易图片浏览器
qq_43397847的博客
01-03 3249
使用C#的一个图片浏览器,获取一个文件夹里的图片,在TreeView控件中显示出来,并在Image中显示预览图,单击TreeView中的图片,可以在最右边的panel中显示图片,双击则用电脑中的默认程序打开图片@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Ma...
Winform实现简单浏览器
10-21
非常简单的一款浏览器源码,但基本的功能都实现了包括网站收藏,截图,快捷菜单等
C#基于Miniblink自己写了一个浏览器,界面风格仿了Edge
一个专注于技术研究创新的程序员
01-30 1002
【代码】C#基于Miniblink自己写了一个浏览器,界面风格仿了Edge。
.Net(C#) CefSharp Chrome 浏览器控件后台执行Iframe中的Js代码的方法
最新发布
weixin_42098295的博客
04-24 550
使用 CefSharp(一个基于 Chromium 的 .NET 浏览器控件)进行网页开发时,你可能会遇到需要在某个iframe中执行 JavaScript 代码的场景。CefSharp 提供了强大的功能,允许你与网页内容进行交互,包括在iframes中执行 JavaScript。
C# 浏览器完整版开发,支持视频、JS交互
01-12
采用谷歌内核CefSharp进行开发,主要是为了实现JS交互,实现前端JS调用原生能力,如:相机、VLC视频能力(主要播放流视频)等。 实现主要功能: 浏览器标签、HTML页面能播放视频、下载记录、JS交互(能调用原生相机、调用VLC集成能力:流视频播放)、软件更新、自定义右键菜单、F11全屏模式、F12调试模式、F5刷新、ALT+F5强制刷新、系统配置等功能、网络请求(HttpClient,支持网络接口情况,json数据解析)、图像处理工具(ImageUtils)、加密解密函数(Cipher)。
C#完整版浏览器开发
XF Android专栏
01-12 4542
采用谷歌内核CefSharp进行开发,主要是为了实现JS交互,实现前端JS调用原生能力,如:相机、VLC视频能力(主要播放流视频)等。 实现主要功能: 浏览器标签、HTML页面能播放视频、下载记录、JS交互(能调用原生相机、调用VLC集成能力:流视频播放)、软件更新、自定义右键菜单、F11全屏模式、F12调试模式、F5刷新、ALT+F5强制刷新、系统配置等功能、网络请求(HttpClient,支持网络接口情况,json数据解析)、图像处理工具(ImageUtils)、加密解密函数(Cipher)
C#复制文件夹的文件到另一个文件夹
xtfgha的专栏
04-11 679
private void CopyDir(string srcPath, string aimPath)  {  try  {  // 检查目标目录是否以目录分割字符结束如果不是则添加  if (aimPath[aimPath.Length - 1] != System.IO.Path.DirectorySeparatorChar)  {  aimPath += System.IO.Path.Di
C# 文件操作(复制、移动、重命名、创建、打开、删除)
热门推荐
熊思雨的博客
03-04 1万+
C#中的IO(Input/Output)操作包括读取和写入文件、读取和写入流、以及操作目录和文件夹等。这些操作都可以通过System.IO命名空间中的类实现。下面对C# IO相关的类和操作进行介绍。要创建一个文件,可以使用File.Create()方法,该方法返回一个FileStream对象,可以用于写入文件数据。StreamReader和StreamWriter类用于读取和写入文本文件。File类提供了对文件的创建、读取、写入、复制、移动、重命名和删除等操作。
C#简单图片浏览器
u010231270的专栏
06-11 1021
本次实验设计出了一个简单的图片浏览器。实验中遇到的难题有两个:缩略图的显示以及图片操作部分。缩略图部分我请教了几个同学,到网上查了不少资料后找到了解决方法。在图片操作方面, 刚开始时就出现了图片显示不全的问题,之后又在进行图片操作(缩放、旋转)时出现了一点小Bug,但最终还是解决了。 本次实验让我更深刻地了解到C#的编程方法,以及在可视化编程时不同控件的相互组合使用的方法。很多时候一个控件解
C#利用winform编写一个简易的文件浏览器程序代码
04-15
在本文中,我们将深入探讨如何使用C#编程语言和Windows Forms(WinForm)来创建一个简易的文件浏览器程序。这个程序具有用户友好的界面,包括菜单、工具栏、树形视图以及文件列表,能够方便地浏览和操作本地文件系统...
C# Winform 一个简单的文件浏览器控件
01-07
在本文中,我们将深入探讨如何使用C# Winform来创建一个简单的文件浏览器控件,该控件基于.NET Framework 4.0。文件浏览器控件是应用程序中常见的元素,它允许用户浏览、选择和操作文件系统中的文件和目录。在C#编程...
C#实现一个简易浏览器代码
02-15
以上就是使用C#实现一个简易浏览器的基本步骤。这个浏览器虽然简单,但足以展示基本的网页浏览功能。通过进一步扩展,如添加书签管理、历史记录、多标签页等功能,我们可以构建一个更加完善的Web浏览器。同时,理解...
C#编程实现简易图片浏览器的方法
09-03
C#编程中,创建一个简易的图片浏览器可以是一个实用且有趣的项目,它涉及到Windows Forms (WinForm) 应用程序开发。以下是一些关键知识点和实现步骤: 1. **命名空间引用**: 使用 `using System.IO;` 引入了...
c#浏览器
01-07
标题 "c#浏览器" 暗示了我们即将探讨的是使用C#编程语言构建一个浏览器的实践。C#是一种面向对象的、现代的编程语言,由微软开发,广泛应用于Windows应用程序开发,游戏开发,以及Web应用,包括浏览器的创建。 ...
C#文件操作集合三(文件及目录的创建和删除)
MarcoPro的博客
01-07 2198
文件操作是开发过程中经常遇到的,如何创建文件、处理文件、保存文件以及读取文件这些工作是每一位开发都必须经历的。本节整理了文件及目录的创建、获取和删除。主要使用了File类和Dictionary类。
C# .NET 6.0已经取消了Framework 4.8的WebBrowser控件,几款NuGet中的浏览器控件介绍
m0_58015531的博客
06-23 3279
技术是好的与坏的,好人用技术是更好的,坏人用技术是更坏的。CefSharp:CefSharp是一个基于Google Chrome的开源项目,它提供了一个强大的浏览器控件,可以在C#应用程序中嵌入和使用。请注意,WebView2控件是.NET 6.0中推荐使用的浏览器控件,因为它基于Chromium引擎,提供了更现代和强大的Web浏览体验。柏拉图在他的巨著《理想国》的第七卷里写到了洞穴理论阐明:一群从小被囚禁生活在洞穴里人,在洞穴外面的光线照明下,往内看是一片片黑影,往外看是光明的海阔天空,越看越明亮!
C# 文件操作之创建文件夹
ithome
09-21 2355
本文章主要是讲述C#中文件操作的基础知识,如何创建文件夹、创建文件、介绍Directory类\DirectoryInfo类和使用FolderBrowserDialog组件(文件夹对话框)。文章属于基础知识,参考了书籍刘丽霞《C#范例开发大全》,希望对大家有用! 一.界面设计 创建的C# Windows窗体应用程序,界面设计如下添加Lable控件、TextBox控件(其中textBox1可设置属...
C#学习笔记004——生成(创建)文本文件
SYW的博客
09-07 5001
———————————— C#:生成(创建)文本文件 ————————————— 很重要的一个头文件:using System.IO; 很重要的类:StreamWriter、StreamWriter、File — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — 法一:作为一个初级自学菜鸟(分不清StreamWriter和StreamWriter,也搞不懂他们怎么用),我最常用的方法 必要控件:一个Button + 一个 TextBox
wpf使用cefsharp浏览器
07-04
### 回答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都能提供所需的功能和灵活性。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 当绘图遇上Caché之元数据代理 15208
  • Base64串介绍 10851
  • M和打印及绘图的火花 6956
  • Asp.Net的ashx模式转.NetCore初探索 6406
  • C#实现图片旋转 4840

分类专栏

  • JRT 17篇
  • linux 50篇
  • Caché 44篇
  • js 1篇
  • DotNetCore 22篇
  • C# 39篇
  • http 7篇
  • C++ 20篇
  • electron 4篇
  • easyUI 3篇
  • HTML 5篇
  • c 24篇
  • 哈希
  • nginx 1篇
  • httpd 1篇
  • TCP 4篇
  • 串口 4篇
  • STM32 10篇
  • FreeRTOS 9篇
  • SQL 1篇
  • https 4篇
  • 笔记 2篇
  • winform 5篇
  • 状态机 1篇
  • C#webservice 2篇
  • 网站 2篇
  • Office 1篇
  • ORM 1篇
  • 码表 1篇
  • iMedicalLIS 12篇
  • 设计模式 10篇
  • 线程 1篇
  • 检验仪器 11篇
  • 吐槽

最新评论

  • Excel怎么导出百万级数据

    weixin_f: 能否提供NPOI SXSSFWorkbook 版本网上下载不到了 vs2010开发

  • JRT性能演示

    qq_45078711: 博主,希森美康全自动血液分析流水线XN-SERIES这个设备你知道吗?

  • jrt落地deepin

    普通网友: 每当我阅读你的编程博客文章时,我总能感受到你的专业水平和耐心解答的精神。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Sebia蛋白电泳画图

    qq_14970475: VB代码的有没有,这个仪器太垃圾了,要不是他们死缠烂打,谁这么无聊画图

  • JRT多服务器同步程序

    2301_82257317: 写的很好!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

大家在看

  • 280个地级市常用控制变量(2003-2021年) 244
  • 鸿蒙开发 03 封装 @ohos/axios (最新深度封装)
  • 细水长流:使用Scikit-Learn实现模型的增量预测 397
  • C语言数组预处理补充思维导图
  • 顺序程序设计、输入与输出 369

最新文章

  • JRT报告打印设计
  • JRT实体视图查询
  • JRT打印设计器解耦
2024
07月 6篇
06月 4篇
05月 9篇
04月 17篇
03月 5篇
02月 12篇
01月 25篇
2023年71篇
2022年102篇
2021年64篇
2020年15篇
2019年24篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小乌鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值

PHP网站源码罗湖网站推广工具横岗建网站宝安seo网站推广福田企业网站建设光明标王平湖网络推广广州企业网站改版坪地网站优化塘坑企业网站设计广州网站改版石岩标王西乡百度爱采购塘坑网站优化吉祥关键词排名包年推广南澳SEO按天扣费石岩SEO按天计费塘坑企业网站制作福永网站优化同乐网站优化排名沙井seo大鹏百搜标王光明建站坪山企业网站制作永湖网站seo优化西乡seo排名爱联网站优化按天扣费盐田百度网站优化排名惠州营销网站大运设计公司网站沙井阿里店铺托管歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化