C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)

有一个winform项目,需要借助一个web项目来显示,并且对web做一些操作,web页目是需要用谷歌内核,基于谷歌 Chromium项目的开源Web Browser控件来开发写了一个demo。

安装步骤

第一步:右键项目,点击 管理NuGet程序包 , 输入Cefsharp 关键字搜索, 选择 CefSharp.WinForms 进行安装

安装完后,以packages.config中可以看到如下信息

第二步:修改配置管理器,将平台修改为X86或X64,Cef有32和64位之分

在 活动方案解决平台 下拉,点击新建

选择 X86 ,点击确定,接着关闭即可

第三步:编写代码,初始化浏览器

cs 复制代码
using CefSharp.WinForms;
using CefSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebApp
{
    public partial class Form1 : Form
    {
        private ChromiumWebBrowser browser;

        public Form1()
        {
            InitializeComponent();
            //窗口最大化
            this.WindowState = FormWindowState.Maximized;
            //窗口全屏
            //this.FormBorderStyle = FormBorderStyle.None;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 初始化浏览器
            InitializeChromium();
        }

        private void InitializeChromium()
        {
            string website = "http://www.baidu.com";

            CefSettings settings = new CefSettings();
            settings.IgnoreCertificateErrors = true;
            Cef.Initialize(settings);
            //创建实例
            browser = new ChromiumWebBrowser(website);
            this.Controls.Add(browser);
        }
    }
}

最终启动程序,成功访问百度

常见疑问

右键菜单如何禁用?

建立MenuHandler类,继承cef中的IContextMenuHandler,并且实现他的接口

cs 复制代码
    public class MenuHandler : IContextMenuHandler
    {
        void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
        {
            model.Clear();
        }

        bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
        {
            //throw new NotImplementedException();
            return false;
        }

        void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
        {
            //throw new NotImplementedException();
        }

        bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
        {
            return false;
        }
    }

设置ChromiumWebBrowser的 MenuHandler属性即可

browser.MenuHandler = new MenuHandler(); //禁用右键菜单

如何添加页面加载完成回调事件?

设置ChromiumWebBrowser的 FrameLoadEnd 属性

cs 复制代码
        private void InitializeChromium()
        {
            string website = "http://www.baidu.com";

            CefSettings settings = new CefSettings();
            settings.IgnoreCertificateErrors = true;
            Cef.Initialize(settings);
            //创建实例
            browser = new ChromiumWebBrowser(website);
            //禁用右键菜单
            //browser.MenuHandler = new MenuHandler();

            //页面加载完成事件
            browser.FrameLoadEnd += webview_FrameLoadEnd;
            this.Controls.Add(browser);
        }
 

        private void webview_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        {
            
        }

浏览器中的 js如何回调到 winform窗体中?

初始化chromeBrowser对象时,需要事先注册好回调方法

cs 复制代码
browser.RegisterJsObject("boundAsync", new BoundObject());

事先建立一个类,专门用来放需要回调的方法

cs 复制代码
    public class BoundObject
    {
        // 这里定义从JavaScript调用的方法  
        public void OnKeyDown()
        {
            Application.Exit();
        }

        public void opencmd()
        {
            MessageBox.Show("JS回调");
        }
    }

源码: 点击下载​​​​​​​

结尾:样例小程序二维码,自己做的一个免费好用的排班小程序

相关推荐
Evand J5 小时前
【MATLAB例程】TOA和AOA混合的高精度定位程序,适用于三维、N锚点的情况
开发语言·matlab
CHANG_THE_WORLD6 小时前
C++并发编程指南08
开发语言·c++·算法
hez20106 小时前
Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
c#·.net·aot·.net core·clr·compiler
kongxx7 小时前
Maven运行任何命令都报错“Internal error: java.lang.ArrayIndexOutOfBoundsException”
java·开发语言·maven
xxxxxue7 小时前
.Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
c#·.net·简体中文·繁体中文·繁体·简体·日文
lsx2024067 小时前
Rust 条件语句
开发语言
Y编程小白8 小时前
ECMAScript--promise的使用
开发语言·前端·ecmascript
幻想趾于现实8 小时前
运算符(C#)
开发语言·c#
Ciderw8 小时前
Go的垃圾回收(GC)机制
开发语言·c++·后端·面试·golang·gc
java1234_小锋8 小时前
JVM对象分配内存如何保证线程安全?
java·开发语言·jvm