Electron+Vue实现两种方式的截屏功能

server/2024/10/19 4:24:34/

本次介绍的截屏功能一共有两种分别是在electron环境中与非electron环境中

electron环境

这个环境下会有一些限制:

1.只能截浏览器中的画面

2.如果里面有iframe或者base64的图片会加载不出来(这个会有解决办法)

yarn add -D js-web-screen-shot

使用的话也非常简单,直接上代码了

javascript"><template><div class="screenWrapper"><h1>这里是截屏界面</h1><button id="startButton" class="button" @click='showVideo'>开始截屏</button><div class="imgWrapepr"><img :src='srcData' width="200px"/></div></div>
</template><script setup lang="ts">
import { ref } from 'vue'
import ScreenShot  from "js-web-screen-shot";
const srcData = ref()
const videoRef = ref()const showVideo = () => {new ScreenShot ({enableWebRtc: false,  clickCutFullScreen: true,level: 9999,  //层级级别completeCallback: callbackSrc})
}const callbackSrc = (data: any) => {srcData.value = data.base64
}
</script><style lang="less" scoped>
.screenWrapper {-webkit-app-region: no-drag;background-color: white;height: 100vh;width: 100vw;padding: 20px;h1 {color: green;}.imgWrapepr {border: 1px solid #ccc;width: 500px;height: 500px;}
}
.box-img{width: 200px;position: fixed;right: 10px;top: 10px;border: 2px solid red; }
</style>

但是会有第二种的限制,如果画面有iframe 的话就不行了,就像这样

这种情况下就得开启webrtc模式,但是也不是所有的浏览器都支持,很操但

javascript">    new ScreenShot ({enableWebRtc: true,   // 改成trueclickCutFullScreen: true,level: 9999,  //层级级别completeCallback: callback})

electron环境

electron环境下之前的方法可以使用,但是弊端也有,不过可以从electron中获取当前应用的视频流信息,可以规避这个问题

第一步就是从主线程中调用desktopCapturer获取当前应用的ID

javascript">const selfWindws = async () =>await Promise.all(webContents.getAllWebContents().filter((item) => {const win = BrowserWindow.fromWebContents(item);return win && win.isVisible();}).map(async (item) => {const win = BrowserWindow.fromWebContents(item);const thumbnail = await win?.capturePage();// 当程序窗口打开DevTool的时候  也会计入return {name:win?.getTitle() + (item.devToolsWebContents === null ? "" : "-dev"), // 给dev窗口加上后缀id: win?.getMediaSourceId(),display_id: "",appIcon: null,};}));

拿到ID之后用js获取视频流

javascript">
// 获取指定id设备的视频流
export const getInitStream = async (source: { id: string },audio?: boolean
): Promise<MediaStream | null> =>{return new Promise((resolve, _reject) => {// 获取指定窗口的媒体流// 此处遵循的是webRTC的接口类型  暂时TS类型没有支持  只能断言成any(navigator.mediaDevices as any).getUserMedia({audio: audio? {mandatory: {chromeMediaSource: "desktop",},}: false,video: {mandatory: {chromeMediaSource: "desktop",chromeMediaSourceId: source.id,},},}).then((stream: MediaStream) => {resolve(stream);}).catch((error: any) => {console.log(error);resolve(null);});});
}

然后把视频流直接怼到这个截屏组件上

javascript">getInitStream(id: string).then(res=> {new ScreenShot ({enableWebRtc: true,  creenFlow: res1!, // 传入屏幕流数据clickCutFullScreen: true,level: 9999,  //层级级别completeCallback: callback})
})

如果你只是想要截浏览器内的内容,这个就满足你的需求了!

但是如果你想做成跟微信QQ一样能截应用外面的,就要使用第三方库

这里就直接使用QQ封装好的截图工具(非常好用)

javascript">exec(path.join(__dirname, '..', '..', 'static', 'PrintScr.exe'))

稍后遗憾的是,人家封装好的有别人的业务功能(转发功能)

如果不想用人家封装好的话就需要自己调用dll文件去做一遍,不过在electron中调用dll, 那就得安装ffi ,那是非常难安依赖。

就这样吧 资源在这了自己去拉吧 

https://github.com/liangtongzhuo/electron_screenshot.git


http://www.ppmy.cn/server/132939.html

相关文章

设计模式:单例模式

单例模式保证一个类只有一个实例&#xff0c;并且提供了全局访问该实例的方法。在单例模式中&#xff0c;通常使用一个静态方法或者一个静态变量来保存实例。该实例被程序的所有模块共享。 具体过程&#xff1a; 1、定义一个单例类 2、私有化构造函数&#xff0c;防止外界直…

如何在Android中存储数据?

在Android中存储数据是开发过程中至关重要的一环&#xff0c;根据数据的类型、大小、访问频率及安全性需求&#xff0c;开发者可以选择多种存储方式。以下是Android中存储数据的几种主要方式&#xff0c;每种方式都有其特定的应用场景和优缺点。 一、SharedPreferences Share…

Redis拒绝连接问题分析与解决方案

目录 前言1. 问题描述2. Redis拒绝连接的常见原因分析2.1 Redis服务未启动2.2 Redis配置中的绑定地址问题2.3 防火墙或安全组问题2.4 Redis连接池耗尽2.5 Redis服务器负载过高2.6 权限配置问题 3. 深度解决方案和优化建议4. 总结 前言 在分布式系统中&#xff0c;Redis作为高性…

Java基于SSM微信小程序物流仓库管理系统设计与实现(lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

机器学习:opencv--光流估计

目录 前言 一、光流估计前提 1.亮度恒定 2.小运动 3.空间一致 二、光流估计案例 前言 光流估计&#xff08;Optical Flow Estimation&#xff09;是计算机视觉中的一种技术&#xff0c;用于估计在连续帧图像中物体或场景的运动。它基于假设&#xff1a;在短时间间隔内&am…

Spring Boot为医疗行业B2B平台带来的变革

第2章 设计技术与开发环境 2.1 相关技术介绍 2.1.1 B/S模式分析 C/S模式主要由客户应用程序(Client)、服务器管理程序(Server)和中间件(middleware)三个部件组成。客户应用程序是系统中用户与数据组件交互。服务器程序负责系统资源&#xff0c;如管理信息数据库的有效管理&…

【Python数据分析】利用Pandas库轻松处理大数据

【Python数据分析】利用Pandas库轻松处理大数据 在现代数据分析中&#xff0c;随着数据量的快速增长&#xff0c;处理大规模数据成为了必然的挑战。幸运的是&#xff0c;Python作为最受欢迎的编程语言之一&#xff0c;其生态系统为我们提供了强大的工具&#xff0c;尤其是Pand…

Cocos Creator 原生Android项目打 aab 包,升级到Android14(API 34)

注意:打aab包的前提是需要配置对应gradle文件。这里我简单说下,我这边做的。 1.setting.gradle文件中配置 include ‘:asset_pack’ 。如下图 2.找到对应的 asset_pack 的 gradle文件,一定要改assetPack。如下图: deliveryType = “install-time” //PAD资源分发 安装时分…