使用electron怎么实现网盘的悬浮窗口?

本篇文章给大家带来的内容是关于使用electron怎么实现网盘的悬浮窗口?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

相关依赖

里面使用了vuex  vue  vue-route storeJs

storeJs 用来持久化vuex状态

展示

2372268816-5bcc53b4eb78e_articlex.png

2990501706-5bcc56627f51e_articlex.png

介绍说明

没有使用electron内置的-webkit-app-region: drag 因为使用他那个有很多问题
比如事件无法使用 右键无法使用 以及不能使用手型等!

安装

安装的时候没有截图 所以就参考下其他的文章吧
storeJs 安装

npm install storejs

登录后复制

准备写代码

配置路由文件

export default new Router({    routes: [        {path: '/', name: 'home', component: ()=> import('@/view//home')},        {path: '/suspension', name: 'suspension', component: ()=> import('@/view/components/suspension')}    ]})

登录后复制

写悬浮窗页面

页面路径 /src/renderer/view/components/suspension.vue

    
拖拽上传
export default { name: "suspension", mounted() { let win = this.$electron.remote.getCurrentWindow(); let biasX = 0; let biasY = 0; let that = this; document.addEventListener('mousedown', function (e) { switch (e.button) { case 0: biasX = e.x; biasY = e.y; document.addEventListener('mousemove', moveEvent); break; case 2: that.$electron.ipcRenderer.send('createSuspensionMenu'); break; } }); document.addEventListener('mouseup', function () { biasX = 0; biasY = 0; document.removeEventListener('mousemove', moveEvent) }); function moveEvent(e) { win.setPosition(e.screenX - biasX, e.screenY - biasY) } } } * { padding: 0; margin: 0; } .upload { height: 25px; line-height: 25px; font-size: 12px; text-align: center; color: #74A1FA; } .logo { width: 40px; background: #5B9BFE url("../../assets/img/logo@2x.png") no-repeat 2px 3px; background-size: 80%; } .content_body { background-color: #EEF4FE; width: 100%; } #suspension { -webkit-user-select: none; cursor: pointer; overflow: hidden; } #suspension { cursor: pointer !important; height: 25px; border-radius: 4px; display: flex; border: 1px solid #3388FE; }

登录后复制

主进程创建悬浮窗页面代码

路径: /src/main/window.js

import {BrowserWindow, ipcMain, screen, Menu, shell, app, webContents} from 'electron'var win = null;const window = BrowserWindow.fromWebContents(webContents.getFocusedWebContents());const winURL = process.env.NODE_ENV === 'development' ? `http://localhost:9080/#/suspension` : `file://${__dirname}/index.html/#/suspension`;ipcMain.on('showSuspensionWindow', () => {    if (win) {        if (win.isVisible()) {            createSuspensionWindow();        } else {            win.showInactive();        }    } else {        createSuspensionWindow();    }});ipcMain.on('createSuspensionMenu', (e) => {    const rightM = Menu.buildFromTemplate([        {label: '开始全部任务', enabled: false},        {label: '暂停全部任务', enabled: false},        {label: '本次传输完自动关机'},        {type: 'separator'},        {            label: '隐藏悬浮窗',            click: () => {                window.webContents.send('hideSuspension', false);                win.hide()            }        },        {type: 'separator'},        {            label: '加入qq群',            click: () => {                shell.openExternal('tencent://groupwpa/?subcmd=all&param=7B2267726F757055696E223A3831343237303636392C2274696D655374616D70223A313533393531303138387D0A');            }        },        {            label: 'GitHub地址',            click: () => {                shell.openExternal('https://github.com/lihaotian0607/auth');            }        },        {            label: '退出软件',            click: () => {                app.quit();            }        },    ]);    rightM.popup({});});function createSuspensionWindow() {    win = new BrowserWindow({        width: 107, //悬浮窗口的宽度 比实际p的宽度要多2px 因为有1px的边框        height: 27, //悬浮窗口的高度 比实际p的高度要多2px 因为有1px的边框        type: 'toolbar',    //创建的窗口类型为工具栏窗口        frame: false,   //要创建无边框窗口        resizable: false, //禁止窗口大小缩放        show: false,    //先不让窗口显示        webPreferences: {            devTools: false //关闭调试工具        },        transparent: true,  //设置透明        alwaysOnTop: true,  //窗口是否总是显示在其他窗口之前    });    const size = screen.getPrimaryDisplay().workAreaSize;   //获取显示器的宽高    const winSize = win.getSize();  //获取窗口宽高    //设置窗口的位置 注意x轴要桌面的宽度 - 窗口的宽度    win.setPosition(size.width - winSize[0], 100);    win.loadURL(winURL);    win.once('ready-to-show', () => {        win.show()    });    win.on('close', () => {        win = null;    })}ipcMain.on('hideSuspensionWindow', () => {    if (win) {        win.hide();    }});

登录后复制

store文件

路径: /src/renderer/store/modules/suspension.js

import storejs from 'storejs'const state = {    show: storejs.get('showSuspension')};const actions = {    showSuspension: function ({state, commit}) {        let status = true;        storejs.set('showSuspension', status);        state.show = status;    },    hideSuspension: function ({state, commit}) {        let status = false;        storejs.set('showSuspension', status);        state.show = status;    },};export default ({    state,    actions});

登录后复制

版权说明

里面使用的百度的图标以及UI作为学习使用,请不要作为商业用途!

遗留问题

在软件关闭之后重启会导致悬浮窗口的位置重置 也曾尝试在主进程中使用store.js  但是不能用!
如果想解决这个问题 可以在渲染进程中将拖动的最后坐标保存到storejs中
在渲染进程给主进程发送异步消息的时候将坐标携带进去  也可以使用nedb在主进程中存储坐标!

github地址

使用electron制作百度网盘客户端: https://github.com/lihaotian0…
使用electron制作百度网盘悬浮窗: https://github.com/lihaotian0…

以上就是使用electron怎么实现网盘的悬浮窗口?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2738502.html

(0)
上一篇 2025年3月8日 01:51:18
下一篇 2025年3月8日 01:51:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • javascript图片上传预览的实现方法(附源码)

    本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 hello,大家好,游戏开始了,欢迎大家收看这一期的讲解。本次的内容是图片的上传预览。最后发源码链接。 废话不多说…

    2025年3月8日
    100
  • vue组件之间相互传递数据的实现方法(代码)

    本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、子组件给父组件传递数据 父组件:{{total}} Vue.component(‘son-component’…

    编程技术 2025年3月8日
    200
  • js运算符有哪些?js运算符的详细介绍

    本篇文章给大家带来的内容是关于js运算符有哪些?js运算符的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 javascript 基础运算符分为:算术运算符、赋值运算符、关系运算符、逻辑运算符;接下来详细讲解着几种…

    编程技术 2025年3月8日
    200
  • 如何使用el-checkbox实现全选(代码)

    本篇文章给大家带来的内容是关于使用el-checkbox实现全选(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近在公司接收到了一个需求,给收藏夹的书籍添加批量、全选删除实现思路:点击全选改变item的check…

    编程技术 2025年3月8日
    200
  • 如何二次封装axios并根据参数来实现多个请求多次拦截(代码)

    本篇文章给大家带来的内容是关于如何二次封装axios并根据参数来实现多个请求多次拦截(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、新建 axiosTool.js 文件,设置请求拦截和处理的逻辑 import …

    编程技术 2025年3月8日
    200
  • vue.js是什么?有什么用?

    学习javascript的时候,我们经常可以看见vue.js,那么vue.js是什么东西呢?可以做什么?很多朋友可能并不完全了解,本篇文章【创想鸟】就来给大家介绍一下vue.js是什么、有什么用,有兴趣的朋友可以看一看。 首先我们来看一下v…

    2025年3月8日
    200
  • Vue中使用axios请求拦截的方法介绍

    本篇文章给大家带来的内容是关于vue中使用axios请求拦截的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、前言 axios的基础使用就不过多的讲解啦,如何使用可以看axios文档使用说明·Axios中文说明…

    2025年3月8日
    200
  • vue修饰符详细总结(附示例)

    本篇文章给大家带来的内容是关于vue修饰符详细总结(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录…

    2025年3月8日 编程技术
    200
  • vue使用原生js实现滚动页面跟踪导航高亮

    本篇文章给大家带来的内容是关于vue使用原生js实现滚动页面跟踪导航高亮,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 需要使用vue做一个专题页面。 滚动页面指定区域导航高亮。 监听滚动页面事件,对比当前页面的位置与元素…

    编程技术 2025年3月8日
    200
  • ajax-plus的使用方法介绍(代码)

    本篇文章给大家带来的内容是关于ajax-plus的使用方法介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ajax-plus 基于axios 的 Vue 插件 如何使用 npm 模块引入 首先通过 npm 安装…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论