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等)做监控,以求对系统运行过程中的硬件性能有…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...