当前位置: 首页 > news >正文

Winform实现自制浏览器JavaScript注入

在这里插入图片描述

让我们一起走向未来

🎓作者简介:全栈领域优质创作者
🌐个人主页:百锦再@新空间代码工作室
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[15045666310@163.com]
📱个人微信:15045666310
🌐网站:https://meihua150.cn/
💡座右铭:坚持自己的坚持,不要迷失自己!要快乐


在现代软件开发中,嵌入浏览器功能到桌面应用程序是一种常见需求。通过这种方式,应用程序能够展示网页内容,并与之进行动态交互。本文将详细探讨如何在WinForm应用程序中嵌入一个浏览器控件,然后在访问特定网页时,注入并执行JavaScript代码。整个文章将分为以下几个部分:

  1. 基础概念与工具选择
  2. WinForm中嵌入浏览器控件的方法
  3. JavaScript注入的基本原理
  4. 注入JavaScript代码并执行的具体实现
  5. 示例应用程序的构建与分析
  6. 安全性与常见问题
  7. 总结与展望

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项目中&#xff0c;pom.xml 文件中的 <parent> 元素用于定义父项目的坐标。使用 <parent> 可以实现继承机制&#xff0c;子项目可以从父项目继承配置信息&#xff0c;比如依赖管理、插件配置等。这样可以避免在多个子项目…...

Ceph后端两种存储引擎介绍

Ceph是一个可靠的、自治的、可扩展的分布式存储系统&#xff0c;它支持文件系统存储、块存储、对象存储三种不同类型的存储&#xff0c;以满足多样存储的需求。在Ceph的存储架构中&#xff0c;FileStore和BlueStore是两种重要的后端存储引擎&#xff0c;下面将分别进行详细介绍…...

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…...

基于标签相关性的多标签学习

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

macOS系统下使用SQLark连接达梦数据库

目录 下载 SQLark 客户端 安装 SQLark 客户端 SQLark用户界面 使用SQLark连接达梦数据库 1. 选择达梦数据库 2. 输入连接信息 3. 测试连接 4. 创建连接 5. 验证连接成功 作为一名数据库开发者&#xff0c;在macOS系统上找到一款支持达梦数据库的数据库开发和管理工具&…...

爬虫如何解决短效代理被封的问题?

在数据采集的征途上&#xff0c;短效代理如同一把双刃剑&#xff0c;它既能为我们带来速度和效率&#xff0c;也可能因为频繁更换IP地址而遭遇被封禁的风险。那么&#xff0c;作为数据采集er的我们&#xff0c;该如何巧妙应对&#xff0c;确保爬虫的稳定运行呢&#xff1f;今天…...

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...