最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Electron+Vue實(shí)現(xiàn)截屏功能的兩種方式

 更新時(shí)間:2024年10月23日 11:33:16   作者:海威  
在Electron環(huán)境下,截屏功能相對(duì)強(qiáng)大,可以通過(guò)desktopCapturer獲取應(yīng)用視頻流,實(shí)現(xiàn)對(duì)整個(gè)應(yīng)用的截屏,而在非Electron環(huán)境下,截屏功能受限,只能截取瀏覽器內(nèi)容,且存在iframe或base64圖片加載問(wèn)題

本次介紹的截屏功能一共有兩種分別是在electron環(huán)境中與非electron環(huán)境中

非electron環(huán)境

這個(gè)環(huán)境下會(huì)有一些限制:

1.只能截瀏覽器中的畫面

2.如果里面有iframe或者base64的圖片會(huì)加載不出來(lái)(這個(gè)會(huì)有解決辦法)

yarn add -D js-web-screen-shot

使用的話也非常簡(jiǎn)單,直接上代碼了

<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,  //層級(jí)級(jí)別
        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>

但是會(huì)有第二種的限制,如果畫面有iframe 的話就不行了,就像這樣

這種情況下就得開啟webrtc模式,但是也不是所有的瀏覽器都支持,很操但

    new ScreenShot ({
        enableWebRtc: true,   // 改成true
        clickCutFullScreen: true,
        level: 9999,  //層級(jí)級(jí)別
        completeCallback: callback
    })

electron環(huán)境

electron環(huán)境下之前的方法可以使用,但是弊端也有,不過(guò)可以從electron中獲取當(dāng)前應(yīng)用的視頻流信息,可以規(guī)避這個(gè)問(wèn)題

第一步就是從主線程中調(diào)用desktopCapturer獲取當(dāng)前應(yīng)用的ID

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();
        // 當(dāng)程序窗口打開DevTool的時(shí)候  也會(huì)計(jì)入
        return {
          name:
            win?.getTitle() + (item.devToolsWebContents === null ? "" : "-dev"), // 給dev窗口加上后綴
          id: win?.getMediaSourceId(),
          display_id: "",
          appIcon: null,
        };
      })
  );

拿到ID之后用js獲取視頻流

// 獲取指定id設(shè)備的視頻流
export const getInitStream = async (
    source: { id: string },
    audio?: boolean
): Promise<MediaStream | null> =>{
    return new Promise((resolve, _reject) => {
    // 獲取指定窗口的媒體流
    // 此處遵循的是webRTC的接口類型  暫時(shí)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);
        });
    });
}

然后把視頻流直接懟到這個(gè)截屏組件上

getInitStream(id: string).then(res=> {
    new ScreenShot ({
       enableWebRtc: true,  
       creenFlow: res1!, // 傳入屏幕流數(shù)據(jù)
       clickCutFullScreen: true,
       level: 9999,  //層級(jí)級(jí)別
       completeCallback: callback
    })
})
 

如果你只是想要截瀏覽器內(nèi)的內(nèi)容,這個(gè)就滿足你的需求了!

但是如果你想做成跟微信QQ一樣能截應(yīng)用外面的,就要使用第三方庫(kù)

這里就直接使用QQ封裝好的截圖工具(非常好用)

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

稍后遺憾的是,人家封裝好的有別人的業(yè)務(wù)功能(轉(zhuǎn)發(fā)功能)

如果不想用人家封裝好的話就需要自己調(diào)用dll文件去做一遍,不過(guò)在electron中調(diào)用dll, 那就得安裝ffi ,那是非常難安依賴。

就這樣吧 資源在這了自己去拉吧 

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

到此這篇關(guān)于Electron+Vue實(shí)現(xiàn)兩種方式的截屏功能的文章就介紹到這了,更多相關(guān)Electron Vue截屏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Vue項(xiàng)目中封裝axios的最新方法

    在Vue項(xiàng)目中封裝axios的最新方法

    這篇文章介紹了axios的基本使用和封裝方法,包括設(shè)置接口請(qǐng)求前綴、請(qǐng)求頭和超時(shí)時(shí)間、封裝請(qǐng)求方法、添加請(qǐng)求和響應(yīng)攔截器,封裝axios可以提高代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下
    2025-02-02
  • Vue入門學(xué)習(xí)筆記【基本概念、對(duì)象、過(guò)濾器、指令等】

    Vue入門學(xué)習(xí)筆記【基本概念、對(duì)象、過(guò)濾器、指令等】

    這篇文章主要介紹了Vue入門學(xué)習(xí)筆記,結(jié)合實(shí)例形式分析了vue.js的基本概念、對(duì)象、過(guò)濾器、指令等的相關(guān)原理與簡(jiǎn)單使用方法,需要的朋友可以參考下
    2019-04-04
  • vue中的eventBus會(huì)不會(huì)產(chǎn)生內(nèi)存泄漏你知道嗎

    vue中的eventBus會(huì)不會(huì)產(chǎn)生內(nèi)存泄漏你知道嗎

    這篇文章主要為大家詳細(xì)介紹了vue中的eventBus會(huì)不會(huì)產(chǎn)生內(nèi)存泄漏,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 解決Vue項(xiàng)目報(bào)錯(cuò)Error:Cannot find module ‘webpack/lib/RuleSet‘問(wèn)題及過(guò)程

    解決Vue項(xiàng)目報(bào)錯(cuò)Error:Cannot find module ‘webpack/li

    解決Vue CLI版本沖突問(wèn)題,確保本地package.json與全局@vue/cli版本一致,避免開發(fā)環(huán)境不一致導(dǎo)致的問(wèn)題,分享個(gè)人解決步驟和版本管理心得,僅供參考
    2026-05-05
  • vue?layout模板頁(yè)的使用實(shí)例詳解

    vue?layout模板頁(yè)的使用實(shí)例詳解

    Vue 項(xiàng)目中使用布局組件來(lái)創(chuàng)建頁(yè)面布局的方式是完全可行的,而且在很多項(xiàng)目中都被廣泛采用,包括像 ruoyi 這樣的框架,這篇文章主要介紹了vue?layout模板頁(yè)的使用,需要的朋友可以參考下
    2023-08-08
  • 在vue項(xiàng)目中,使用axios跨域處理

    在vue項(xiàng)目中,使用axios跨域處理

    下面小編就為大家分享一篇在vue項(xiàng)目中,使用axios跨域處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 詳解如何在Vue中動(dòng)態(tài)添加類名

    詳解如何在Vue中動(dòng)態(tài)添加類名

    本文主要介紹了如何在Vue中動(dòng)態(tài)添加類名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例詳解

    Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue項(xiàng)目之學(xué)生管理系統(tǒng)實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • el-table樹形表格中復(fù)選框聯(lián)動(dòng)功能操作大全

    el-table樹形表格中復(fù)選框聯(lián)動(dòng)功能操作大全

    本文介紹了如何在el-table樹形表格中實(shí)現(xiàn)復(fù)選框聯(lián)動(dòng)功能,包括父級(jí)復(fù)選框控制子級(jí)復(fù)選框狀態(tài)以及子級(jí)復(fù)選框不可控制父級(jí)復(fù)選框狀態(tài)的功能,通過(guò)給表格數(shù)據(jù)添加標(biāo)識(shí)并編寫相應(yīng)的事件處理函數(shù),實(shí)現(xiàn)了這一功能,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • vue項(xiàng)目使用高德地圖的定位及關(guān)鍵字搜索功能的實(shí)例代碼(踩坑經(jīng)驗(yàn))

    vue項(xiàng)目使用高德地圖的定位及關(guān)鍵字搜索功能的實(shí)例代碼(踩坑經(jīng)驗(yàn))

    這篇文章主要介紹了vue項(xiàng)目使用高德地圖的定位及關(guān)鍵字搜索功能的實(shí)例代碼,也是小編踩了無(wú)數(shù)坑總結(jié)出來(lái)的經(jīng)驗(yàn),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

昌都县| 凯里市| 昌宁县| 高雄市| 徐州市| 咸丰县| 修武县| 南阳市| 罗定市| 夹江县| 乐昌市| 西昌市| 祁阳县| 海安县| 体育| 班玛县| 岗巴县| 晴隆县| 莱西市| 大余县| 鹤岗市| 华坪县| 桂林市| 龙井市| 伊宁市| 上林县| 卢湾区| 都匀市| 洞头县| 宝鸡市| 昌图县| 清镇市| 涿州市| 宝丰县| 尖扎县| 东明县| 墨竹工卡县| 吴川市| 镇原县| 图们市| 江津市|