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

news2024/12/28 17:03:20

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

安装步骤


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

6c2ef1f2c255415fa4130793732c533c.png

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

bbd693dd4cdc42a6a2b3bdaf64725570.png

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

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

c3fdde1a321747cd87f8c39f136bb867.png

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

d1ddbf3c29634f1988f4fa86529f618e.png

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

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);
        }
    }
}

最终启动程序,成功访问百度9b6dda0b0940413da2ccd9cf8e8d8ebf.png

常见疑问

右键菜单如何禁用?

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


    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 属性
 

        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对象时,需要事先注册好回调方法

browser.RegisterJsObject("boundAsync", new BoundObject());

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

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

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

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

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

4a5c805b5abc45bfbb032ad436cae942.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过远程控制软件实现企业高效协作

在这个信息技术迅猛发展的时代,远程办公已经成为一种趋势,而远程控制软件则是连接分散团队的重要工具。技术的革新不仅推动了远程控制软件的广泛应用,也为现代办公带来了高效的协作体验。本文将探讨远程控制软件的发展,并以RayLin…

赋能开发者 | 麒麟信安受邀参加2024开放原子开发者大会,以技术为引领,以人才创发展

12月20至21日,以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”在湖北武汉举办。本届大会由开放原子开源基金会、中国通信学会联合主办,旨在贯彻落实国家软件发展战略,加速培育壮大我国开源生态。工业和信息化…

每天40分玩转Django:Django国际化

Django国际化 一、今日学习内容概述 学习模块重要程度主要内容国际化基础⭐⭐⭐⭐⭐基本概念、配置设置字符串翻译⭐⭐⭐⭐⭐翻译标记、消息文件模板国际化⭐⭐⭐⭐模板标签、过滤器动态内容翻译⭐⭐⭐⭐模型字段、表单翻译 二、国际化基础配置 # settings.py# 启用国际化 …

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

一、前言 在国内数字化转型浪潮和 信创 大背景下,“替代进口”成为许多企业级应用所需要面对的重要课题,搜索领域也不例外。 Elasticsearch(简称 ES)作为一款业界领先的全文搜索和分析引擎,虽然功能强大,但…

Ubuntu 24.04.1 LTS 配置静态固定IP地址

查看网络配置信息 ip addr使用该命令查看网卡名字,一般是ens33或者ens32 修改配置文件 打开 /etc/netplan/下面的yaml配置文件 根据自己的需要配置 network:ethernets:ens33: # 配置的网卡的名称addresses: [192.168.23.140/24] # 配置的静态ip地址和掩码d…

Deep Deterministic Policy Gradient (DDPG)算法

代码 import torch import torch.nn as nn import torch.optim as optim import numpy as np import gym import random from collections import deque# 定义 Actor 网络 class Actor(nn.Module):def __init__(self, state_dim, action_dim, max_action):super(Actor, self).…

C++ OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘

学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志&#xff0c…

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总 1.JVM内存中的对象何时会被垃圾回收 (1)什么…

基于SpringBoot在线音乐系统平台功能实现十八

一、前言介绍: 1.1 项目摘要 随着互联网技术的迅猛发展和普及,人们对音乐的获取和欣赏方式发生了巨大改变。传统的音乐播放方式,如CD、磁带或本地下载的音乐文件,已经不能满足用户日益增长的需求。用户更希望通过网络直接获取各…

RouYi-Vue框架,环境搭建以及使用

使用若以框架需要配置node.js,如果不了解可以去看node.js安装,uni-app的配置使用_uniapp使用nodejs类库-CSDN博客 安装若依 首先是去若以官网下载自己所需要的框架类型 RuoYi-Vue: 🎉 基于SpringBoot,Spring Security&#xff…

XL系列433芯片、2.4G收发芯片 通讯对码说明

XL系列433芯片对码说明: 发射芯片 XL4456 通过数据脚接收高低电平然后经过调制将波形发出,而接收芯片 XL520 通过接收波形后进行解调,数据脚输出高低电平。至于具体的通信协议,需要用户自定义,一般而言,使…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址,在Android、iOS不同端中互通,根据MAC 地址处理相关的业务场景; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

期权懂|如何计算期权卖方平仓后的盈利?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 如何计算期权卖方平仓后的盈利? 期权卖方平仓后的盈利计算涉及多个因素,包括期权的交易价格、平仓价格以及权利金的变动等。 交易价格:期权卖…

QT:一个TCP客户端自动连接的测试模型

版本 1:没有取消按钮 测试效果: 缺陷: 无法手动停止 测试代码 CMakeLists.txt cmake_minimum_required(VERSION 3.19) project(AutoConnect LANGUAGES CXX)find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets Network)qt_standard_project_setup(…

uniapp中wx.getFuzzyLocation报错如何解决

一、用wx.getLocation接口审核不通过 用uniapp开发小程序时难免需要获取当前地理位置。 代码如下: uni.getLocation({type: wgs84,success: function (res) {console.log(当前位置的经度: res.longitude);console.log(当前位置的纬度: r…

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后,在Ubuntu系统上装载 D盘,发现无法装载错误如下: Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…

硬件设计-高速电路的过孔

目录 摘要 : 过孔的机械特性: 过孔直径: 过孔焊盘尺寸 摘要 : 过孔这个词指得是印刷电路板( PCB )上的孔。过孔可以用做焊接插装器件的焊( Through hole) ,也可用做连接层间走…

mysql索引的理解

1、索引是什么? 索引:简单理解就是我们字典的目录,一个索引可以找得到多个记录。 作用加快我们数据库的查询速度。索引本身较大,往往存储在磁盘的文件里。可能存储在单独的索引文件中,也可能和数据一起存储在数据文件…

【WRF模拟】如何得到更佳的WRF模拟效果?

【WRF模拟】如何得到更佳的WRF模拟效果? 模型配置(The Model Configuration)1.1 模拟区域domain设置1.2 分辨率Resolution (horizontal and vertical)案例:The Derecho of 29-30 June 2012 1.3 初始化和spin-up预热过程案例1-有无…