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

news/2024/10/23 5:33:06/

本次介绍的截屏功能一共有两种分别是在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/news/1541241.html

相关文章

UE5遇到问题-UE5可正常打包出来但是运行不了

遇到问题&#xff1a; UE5可正常打包出来但是运行不了 解决办法&#xff1a; 首先先在本地运行跑一下工程&#xff1b; 发现是没有关闭插件的问题&#xff0c;点开插件关闭掉相应的插件重新打包就可以了。 参考视频&#xff1a;(新手向)虚幻5打包 打包后双击exe没反应怎么办…

【Unity】Unity中获取网络时间进行每日和每月刷新

直接上代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DateChecker : MonoBehaviour {private DateTime lastCheckedDate; //上次刷新日数据的日期private DateTime lastMonthUtc; //上次刷新月数据的日期T…

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…

Kafka原理剖析之「Purgatory(炼狱 | 时间轮)」

一、前言 本文介绍一下Kafka赫赫有名的组件Purgatory&#xff0c;相信做Kafka的朋友或多或少都对其有一定的了解&#xff0c;至少是听过它的名字。那它的作用是什么呢&#xff0c;用来解决什么问题呢&#xff1f;官网confluent早就有文章对其做了阐述 https://cwiki.apache.o…

django开发连接Mysql报错1045或08001问题处理方法

存在问题&#xff1a; django开发过程中&#xff0c;连接mysql数据库一直报错&#xff0c;如下&#xff1a; 或 网上搜索各种解决办法均无效&#xff08;类似加密方式、配置方式等&#xff09; 解决方案&#xff1a; 查看mysql版本&#xff0c;为8.0.26 django开发中&#x…

C#第5讲:类和对象的使用

一、声明类&#xff1a;使用class关键字&#xff0c;类的属性及方法写在{}中。 二、声明属性 属性最常用的书写方法: public int Age {get; set;} 如果属性中具有get关键字&#xff0c;说明可以获取该属性的值。 如果属性中具有set关键字&#xff0c;说明可以向该属性设置值…

PHP unset() 函数的作用

PHP 中的 unset() 函数用于销毁指定的变量。具体来说&#xff0c;它会解除变量名与其数据之间的关联&#xff0c;从而释放该变量所占用的内存。不过需要注意的是&#xff0c;unset() 并不是删除变量的内容&#xff0c;而是取消对变量名的引用。如果变量是数组中的某个元素或者对…

GitLab CVE-2024-6678、CVE-2024-8640 漏洞解决方案

极狐GitLab 近日发布安全补丁版本17.3.2, 17.2.5, 17.1.7&#xff0c;修复了17个安全漏洞&#xff0c;本分分享 CVE-2024-6678、CVE-2024-8640 两个漏洞详情。 极狐GitLab 正式推出面向 GitLab 老旧版本免费用户的专业升级服务&#xff0c;为 GitLab 老旧版本进行专业升级&…