Winform实现自制浏览器JavaScript注入
让我们一起走向未来
🎓作者简介:全栈领域优质创作者
🌐个人主页:百锦再@新空间代码工作室
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[15045666310@163.com]
📱个人微信:15045666310
🌐网站:https://meihua150.cn/
💡座右铭:坚持自己的坚持,不要迷失自己!要快乐
在现代软件开发中,嵌入浏览器功能到桌面应用程序是一种常见需求。通过这种方式,应用程序能够展示网页内容,并与之进行动态交互。本文将详细探讨如何在WinForm应用程序中嵌入一个浏览器控件,然后在访问特定网页时,注入并执行JavaScript代码。整个文章将分为以下几个部分:
- 基础概念与工具选择
- WinForm中嵌入浏览器控件的方法
- JavaScript注入的基本原理
- 注入JavaScript代码并执行的具体实现
- 示例应用程序的构建与分析
- 安全性与常见问题
- 总结与展望
1. 基础概念与工具选择
在WinForm应用程序中嵌入浏览器的控件,可以使用多种工具。经典的选择是使用Microsoft的WebBrowser控件,但这在现代应用中已经渐渐被淘汰。随着浏览器技术的发展,CEF (Chromium Embedded Framework) 和 WebView2 (Microsoft Edge WebView2 Control) 成为了更好的选择。
WebBrowser控件:基于Internet Explorer内核,功能较为落后且不再维护。

-
CEF (Chromium Embedded Framework):一个简单的框架,用来嵌入基于Chromium的浏览器组件。
-

-
WebView2:基于新Edge(Chromium)的浏览器控件,提供现代化的网页浏览体验。
选择合适的嵌入方式是开发的第一步,鉴于WebView2的简易性和现代化,这里选择它来进行后续的实现。
2. WinForm中嵌入浏览器控件的方法
2.1 准备开发环境
嵌入WebView2需要安装对应的开发工具和库:

- Visual Studio 2019或更高版本。
- .NET 5.0或更高版本。(可选)
- Microsoft Edge WebView2的SDK。
安装WebView2 SDK,打开NuGet包管理器,并安装Microsoft.Web.WebView2包。
2.2 简单的嵌入示例
在WinForm项目中,拖拽一个Panel控件用于占位,然后在代码中加载WebView2控件:
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Web.WebView2.Core;public partial class MainForm : Form
{public MainForm(){InitializeComponent();InitializeWebView2();}private async void InitializeWebView2(){var webView2 = new WebView2{Dock = DockStyle.Fill};panel1.Controls.Add(webView2);await webView2.EnsureCoreWebView2Async(null);webView2.CoreWebView2.Navigate("https://example.com");}
}

3. JavaScript注入的基本原理
WebView2提供了几种向网页注入JavaScript的手段,其核心是利用Context来执行JavaScript。执行JavaScript能够操控网页内容,或者与页面进行数据交互。
常用的方法是调用ExecuteScriptAsync,这个方法接受一个字符串,该字符串包含需要执行的JavaScript代码。
注入注意事项
注入外部代码时,需要特别注意浏览器的同源策略(Same-Origin Policy)和安全性,务必确保外部代码的来源安全。
await webView2.CoreWebView2.ExecuteScriptAsync("document.body.style.backgroundColor = 'lightblue';");

4. 注入JavaScript代码并执行的具体实现
4.1 动态脚本注入
在访问指定网页时,可以通过监听事件进行脚本注入。例如通过NavigationCompleted事件,检测网址并注入对应脚本:
webView2.CoreWebView2.NavigationCompleted += async (sender, args) =>
{if (webView2.Source.ToString() == "https://example.com"){string jsCode = "console.log('JavaScript injected successfully.');";await webView2.CoreWebView2.ExecuteScriptAsync(jsCode);}
};

4.2 基于条件的逻辑注入
为了实现复杂的交互逻辑,可以在软件中检测网页中的特定元素,并在元素存在时执行特定的操作。下面的代码展示了如何读取和修改网页中的元素内容:
string getElementContentScript = "document.querySelector('h1').innerText";
var result = await webView2.CoreWebView2.ExecuteScriptAsync(getElementContentScript);
Console.WriteLine($"Title of the page is {result}");
5. 示例应用程序的构建与分析
5.1 应用功能实现

以一个简单的应用为例,展示如何实现登录流程自动化以及特定用户交互的模拟。想象一个场景,您需要自动填充表单并提交:
string autoFillScript = @"document.querySelector('#username').value = 'testuser';document.querySelector('#password').value = 'password123';document.querySelector('form').submit();
";
await webView2.CoreWebView2.ExecuteScriptAsync(autoFillScript);
5.2 应用程序的整体架构
- 前台界面:使用Panel容纳WebView2控件。
- 后台服务:负责监听WebView2事件、管理注入逻辑。
- 安全机制:确保注入脚本的安全性和合法性。
6. 安全性与常见问题
6.1 同源策略与CORS
JavaScript因同源策略需要进行跨域通信时,需要注意设置CORS允许的源。
6.2 防范XSS攻击
确保不执行不可信的外部输入,并对用户输入进行必要的校验与过滤。
6.3 常见Debug技巧
- 使用浏览器开发者工具调试注入的JavaScript代码。
- 在导航事件中打印日志以跟踪注入周期。
7. 总结与展望
通过WebView2嵌入浏览器控件并注入JavaScript,我们能够有效增强WinForms应用的功能。无论是实现简单的自动化任务,还是构建复杂的嵌入式浏览器应用,该方法均提供了一种现代化的解决方案。展望未来,随着Web技术的进步,嵌入式浏览器将更为普及,开发者也需要持续关注相关的技术更新与安全挑战。

相关文章:
Winform实现自制浏览器JavaScript注入
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出
目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…...
javascript用来干嘛的?赋予网站灵魂的语言
javascript用来干嘛的?赋予网站灵魂的语言 在互联网世界中,你所浏览的每一个网页,背后都有一群默默工作的代码在支撑着。而其中,JavaScript就像是一位技艺精湛的魔术师,它赋予了网页生命力,让原本静态的页…...
Flutter Getx状态管理
在 Flutter 开发中,状态管理是一个非常重要的话题。随着应用变得更加复杂,状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案,如 Provider、Riverpod、BLoC 等,而在这些选项中,GetX 作为一个轻量级…...
《成法》读书笔记
稻盛和夫的《成法》是一部关于个人和企业成功哲学的作品,结合了他在经营京瓷和KDDI,以及重建日航(JAL)过程中的经验和智慧。 以下是这本书的读书笔记,涵盖其核心思想和重要概念: 1. 以“心”为本 内容概…...
TensorFlow 2.0 环境配置
官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…...
Ekman理论回归
Scientific reportsEkman revisited: Surface currents to the left of the winds in the Northern HemisphereVagn Walfrid Ekman1905年的理论描述了地球旋转受到风的作用,摩擦边界层中的流场,北半球总是在海表风的右侧,南半球总是在海表风的…...
算法演练----24点游戏
给定4个整数,数字范围在1~13之间任意使用-*/(),构造出一个表达式,使得最终结果为24, 方法一 算法分析:加括号和取出重复表达式 # 导入精确除法模块,使得在Python2中除法运算的行为更…...
【学习心得】Python好库推荐——tiktoken
一、tiktoken是什么? tiktoken是一个快速BPE分词器,是由 OpenAI 开发的一个用于文本处理的 Python 库,主要用于将文本编码为数字序列(称为 "tokens"),或将数字序列解码为文本。这一过程被称为 &q…...
MacBook不额外安装软件,怎样投屏到安卓手机上?
提起iPhone或MacBook的投屏,人们总会想到airplay功能。但离开了苹果生态,其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上,到底要怎样做?需要安装什么软件吗? 不需要…...
flink sql + kafka + mysql 如何构建实时数仓
构建一个基于 Flink SQL、Kafka 和 MySQL 的实时数据仓库(Data Warehouse)架构,可以通过流处理的方式实现高效、实时的数据集成与分析。以下是如何利用这三者构建实时数仓的步骤与实现: 架构概述 Kafka:作为流数据平台,负责接收和传输来自不同源系统(如应用日志、传感器…...
Go语言开发基于SQLite数据库实现用户表查询详情接口(三)
背景 上一章 Go语言开发基于SQLite数据库实现用户表新增接口(二) 这一章我们实现用户表的查询详情接口 代码实现 mapper层 type UserMapper interface {GetById(id uint64) (*model.User, error)}type userMapper struct { }func (m *userMapper) GetById(id uint64) (*mod…...
(11)(2.1.7) FETtec OneWire ESCs(二)
文章目录 前言 3 组态 4 可选功能 5 SITL模拟 6 故障排除 前言 !Note 此功能在固件版本4.1.1及更高版本上可用。 3 组态 FTW掩码 SERVO_FTW_MASK 参数选择将哪些伺服输出(如果有的话)路由到 FETtec ESC。更改此参数后需要重新启动。…...
Springboot maven常见依赖、配置文件笔记
pom.xml文件 一、<parent> 在Maven项目中,pom.xml 文件中的 <parent> 元素用于定义父项目的坐标。使用 <parent> 可以实现继承机制,子项目可以从父项目继承配置信息,比如依赖管理、插件配置等。这样可以避免在多个子项目…...
Ceph后端两种存储引擎介绍
Ceph是一个可靠的、自治的、可扩展的分布式存储系统,它支持文件系统存储、块存储、对象存储三种不同类型的存储,以满足多样存储的需求。在Ceph的存储架构中,FileStore和BlueStore是两种重要的后端存储引擎,下面将分别进行详细介绍…...
C++入门基础知识140—【关于C++ 类构造函数 析构函数】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 类构造函数 & 析构函数的相关内容…...
基于标签相关性的多标签学习
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
macOS系统下使用SQLark连接达梦数据库
目录 下载 SQLark 客户端 安装 SQLark 客户端 SQLark用户界面 使用SQLark连接达梦数据库 1. 选择达梦数据库 2. 输入连接信息 3. 测试连接 4. 创建连接 5. 验证连接成功 作为一名数据库开发者,在macOS系统上找到一款支持达梦数据库的数据库开发和管理工具&…...
爬虫如何解决短效代理被封的问题?
在数据采集的征途上,短效代理如同一把双刃剑,它既能为我们带来速度和效率,也可能因为频繁更换IP地址而遭遇被封禁的风险。那么,作为数据采集er的我们,该如何巧妙应对,确保爬虫的稳定运行呢?今天…...
Jmeter基础篇(22)服务器性能监测工具Nmon的使用
一、前言 我们在日常做压测的过程中,不仅仅需要监控TPS,响应时间,报错率等这些系统基础性能数据,还需要对服务器的性能(如CPU、磁盘、内存、网络IO等)做监控,以求对系统运行过程中的硬件性能有…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

