使用electron实现百度网盘悬浮窗口功能的示例代码


Posted in Javascript onOctober 24, 2018

相关依赖

里面使用了vuex vue vue-route storeJs

storeJs 用来持久化vuex状态

展示

使用electron实现百度网盘悬浮窗口功能的示例代码

使用electron实现百度网盘悬浮窗口功能的示例代码

介绍说明

没有使用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

<template>
  <div id="suspension">
    <div class="logo"></div>
    <div class="content_body">
      <div class="upload">拖拽上传</div>
    </div>
  </div>
</template>

<script>
  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)
      }
    }
  }
</script>

<style>
  * {
    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;
  }
</style>

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

路径: /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¶m=7B2267726F757055696E223A3831343237303636392C2274696D655374616D70223A313533393531303138387D0A');
      }
    },
    {
      label: 'GitHub地址',
      click: () => {
        shell.openExternal('https://github.com/lihaotian0607/auth');
      }
    },
    {
      label: '退出软件',
      click: () => {
        app.quit();
      }
    },
  ]);
  rightM.popup({});
});

function createSuspensionWindow() {
  win = new BrowserWindow({
    width: 107, //悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框
    height: 27, //悬浮窗口的高度 比实际DIV的高度要多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
});

遗留问题

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

github地址

使用electron制作百度网盘客户端: https://github.com/lihaotian0607/baidupan
使用electron制作百度网盘悬浮窗: https://github.com/lihaotian0607/electron-suspension

目前这个开源代码中没有悬浮窗 有时间了会加上去!!!

Javascript 相关文章推荐
Mootools 1.2教程 函数
Sep 15 Javascript
Jquery index()方法 获取相应元素索引值
Oct 12 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
ExtJS4 表格的嵌套 rowExpander应用
May 02 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
Mar 02 Javascript
jquery中checkbox使用方法简单实例演示
Nov 24 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
JavaScript根据json生成html表格的示例代码
Oct 24 #Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 #Javascript
vue中的router-view组件的使用教程
Oct 23 #Javascript
jQuery pagination分页示例详解
Oct 23 #jQuery
jquery.pagination.js分页使用教程
Oct 23 #jQuery
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 #Javascript
jquery分页插件pagination使用教程
Oct 23 #jQuery
You might like
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
php生成无限栏目树
2017/03/16 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
python matplotlib坐标轴设置的方法
2017/12/05 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
用python爬取租房网站信息的代码
2018/12/14 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
客户经理竞聘演讲稿
2014/05/15 职场文书
硕士生找工作求职信
2014/07/05 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android