(新手推荐)技术胖博客以及Electron教程:https://jspang.com/detailed?id=62
Electron官方文档:https://www.electronjs.org/docs
ElectronAPI手册:https://www.electronjs.org/docs/api
点击查看【bilibili】
关注赞赏支持
需要掌握的三门语言JS,HTML,CSS
1.安装Vscode IDE
官网下载:https://code.visualstudio.com/Download
扩展插件:
安装中文语言
皮肤主题(个人推荐)
搜索:escook-theme
代码自动排版
搜索:Prettier - Code formatter
注释翻译

搜索:Google Translate
快捷键Ctrl+Alt+t 翻译并替换
颜色标识括号
vs code 终端中文显示乱码

chcp 65001
2.安装node.js
1.官网:nodejs.org
安装包直接下载:
node-v12.13.0-x64.rar
路径可以设置D:\nodejs,这里打勾✔就行
node安装成功
//打开VS终端输入node -v//=> v12.13.0 我安装的node.js版本号,说明安装成功


这里我安装在D:\nodejs,环境变量自动生成
如果没有就自己手动新建
npm安装命令
//node自带npm命令,后面会大量使用npm命令来进行安装各种第三方模块npm install 模块//简写npm i 模块//全局安装npm i -g 模块//MAC系统全局安装需要获取管理员权限sudo npm i -g 模块
npm卸载命令
npm uninstall 模块
常用功能:
npm install —save:
会把msbuild包安装到node_modules目录中L:
会在package.json的dependencies属性下添加msbuild
之后运行npm install命令时,会自动安装msbuild到node_modules目录中
之后运行npm install —production或者注明NODE_ENV变量值为production时,会自动安装msbuild到node_modules目录中
npm install —save-dev:
会把msbuild包安装到node_modules目录中
会在package.json的devDependencies属性下添加msbuild
之后运行npm install命令时,会自动安装msbuild到node_modules目录中
之后运行npm install —production或者注明NODE_ENV变量值为production时,不会自动安装msbuild到node_modules目录中
通俗来说,—save是已经上线后的项目运行时必须要的东西;—save-dev是开发者在编辑项目时需要的东西;
package.json文件
//初始化package.json文件npm init//package.json文件{"script":{"启动": "electron ."}}//自定义脚本命令npm run 启动
win系统配置npm全局默认路径
如下图**移动到D:\nodejs建立2个目录node_global和**nodejs\node_cache
每次重启电脑后使用npm都要重新设置!
//然后运行以下2条命令npm config set prefix "D:\nodejs\node_global"npm config set cache "D:\nodejs\node_cache"npm config get prefix 查看目录路径//设置成功后使用 npm install -g 全局安装会把安装的文件放入D:\nodejs\node_global中,方便使用和卸载
编辑环境变量 NODE_PATH 
D:\nodejs\node_global
**
2.创建Electrion项目
快速搭建
https://github.com/PowerDos/serialport_electron_start/tree/master/demo/electron-quick-start
# Clone this repositorygit clone https://github.com/electron/electron-quick-start# Go into the repositorycd electron-quick-start# Install dependenciesnpm install# Run the appnpm start
主程序:
创建一个文件夹,用VS打开文件夹,在文件夹中创建main.js文件
1.main.js
//main.js内容console.log("人鱼情未了")
2.生成package.json配置文件

//在VS终端输入命令,yes代表自动全部选择YESnpm init --yes
3.下载Electron模块

//首先安装cnpm,因为npm命令下载有时候是国外的链接,网速不行卡住就需要切换cnpm,设置淘宝镜像npm install -g cnpm --registry=https://registry.npm.taobao.org//MAC系统需要获取管理权限sudo npm install -g cnpm --registry=https://registry.npm.taobao.org//Electron模块文件比较大,使用cnpm下载 --save:自动设置到package.json配置cnpm i electron --save
4.运行程序

//package.json配置文件加入脚本命令"scripts": {"test": "echo \"Error: no test specified\" && exit 1","start":"electron ."},

//package.json脚本命令,start会在当前文件夹里找到electron.exe启动程序//运行npm start//如果electron使用 -g 全局安装,则可以直接使用electron .,但是不会在项目里下载node_modules文件夹//所以不建议新手使用该方法.cnpm i -g electron//运行electron .//CTRL+C 退出程序
官方窗口渲染(UI):
下载解压electron-quick-start-master.zip
用VS打开这个文件夹
1.需要手动设置main.js里的参数,旧版本默认true,新版本默认false
//main.jswebPreferences: {nodeIntegration:true //设置true才能在其他文件里调用主进程的函数}
2.下载Electron模块
方案一://下载官方package.json配置文件里指定的electron@v8.2.1版本npm i方案二://更新至最新版cnpm install --save-dev electron@latest
//运行npm start
启动成功:
手动渲染(UI):
1.main.js
var electron = require('electron') //引入electron模块var app = electron.app // 创建electron引用var BrowserWindow = electron.BrowserWindow; //创建窗口引用var mainWindow = null ; //声明要打开的主窗口app.on('ready',()=>{mainWindow = new BrowserWindow({width:400,height:400,webPreferences:{nodeIntegration:true} //设置别的页面可以调用函数}) //设置打开的窗口大小mainWindow.loadFile('index.html') //加载那个页面//监听关闭事件,把主窗口设置为nullmainWindow.on('closed',()=>{mainWindow = null})})
2.index.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>我的程序名称</title></head><body>Hello World!</body></html>
3.生成package.json配置文件
操作与上面 主程序 一致
4.下载Electron模块
操作与上面 主程序 一致
渲染进程注意事项
创建多个子窗口属性
创建和控制浏览器窗口。
需要注意的是,在主进程和渲染进程调用的方式不一样
在主进程中直接调用:const {BrowserWindow} = require(‘electron’)
在渲染进程中则需使用remote来调用:const {BrowserWindow} = require(‘electron’).remote
参考:https://www.jianshu.com/p/95bf81f84a53
鼠标跟随事件
使用
问题解决:iframe传参到新窗口的坑
1.父窗口有三个iframe,分别为a,b,c
2.从a打开了放大镜,创建新窗口,如何把c的监控鼠标移动数据传输到a的新窗口上?
//父窗口 index.html<iframe src="a.html"></iframe><iframe src="b.html"></iframe><iframe src="c.html"></iframe><script>//a.html使用的函数,创建新窗口function fangdajing() {window.open('a2.html')}window.addEventListener('message', function (msg) { //监听//监听成功开始监控 c.html 鼠标是否移动frames['c'].contentWindow.document.addEventListener('mousemove', function (e) {//e是c.html返回的对象数据msg.source.postMessage("(X:" + e.clientX + ",Y:" + e.clientY + ")", "*");})</script>//子窗口 a.html<div id='fangdajing'>放大镜</div>//监听点击事件调用父窗口函数创建新窗口 a2.html<script>document.getElementById('fangdajing').addEventListener('click', function (e) {window.parent.fangdajing()})</script>//子窗口 a2.html<div id="子窗口"></div><script>window.opener.postMessage('') //打开窗口直接发送数据与父窗口连接//不断的监听父窗口返回 c.html 的鼠标移动信息并显示在页面上window.addEventListener('message', function (msg) {document.getElementById("子窗口").innerHTML = JSON.stringify(msg.data) //接收父窗口发送过来得数据})</script>
window.open()
百度上的例子都无法在electron里使用.这里只能使用接收和发送数据的方式来使用
iframe **与**  window.open() **在 Electron里的区别:
window.parent 等于 窗口.返回父窗口
Electron里使用 window.open() 创建的子窗口不能使用 window.parent 调用父窗口变量和方法
Electron里使用 
//window.open()父窗口  先接收,后发送
window.addEventListener('message',function(msg){     
    console.log(JSON.stringify(msg.data))  //接收子窗口发送过来得数据
      msg.source.postMessage("我是父窗口过来的数据", "*");
})
//window.open()子窗口  先发送,后接收
window.opener.postMessage('我是子窗口1发过来得')
window.addEventListener('message', function (msg) {
  console.log(JSON.stringify(msg.data))  //接收父窗口发送过来得数据
})
iframe
//父窗口调用iframe的变量和方法
 <iframe id="c" src="./xianshi.html" ></iframe>
 <iframe id="d" src="./xianshi2.html" ></iframe>
frames['c'].contentWindow.document.getElementById('canvas')
frames['c'].contentWindow.c //  1
var a=11
//iframe 子窗口c
var c=1
window.parent.a // 11
window.parent.frames['d'].contentWindow.d  //2
//iframe 子窗口d
var d=2
3.安装编译模块
-g 表示全局安装模块到目录D:\nodejs\node_global下
1.cnpm命令
//首先安装cnpm,因为npm命令下载有时候是国外的链接,网速不行卡住就需要切换cnpm,设置淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
//MAC系统需要获取管理员权限
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
有其他人遇到一些问题,这里注意能使用npm就尽量不要使用cnpm
2.yarn命令
1.查询当前配置的镜像
yarn config get registry
> https://registry.yarnpkg.com
设置成淘宝镜像
yarn config set registry http://registry.npm.taobao.org/
3.windows-build-tools模块(win系统)
//安装windows-build-tools模块,里面包含python2.7,编译c++生成工具,因为外网速度会比较慢
//主要用于调用各种第三方模块
cnpm install -g --production windows-build-tools
在软件管家卸载界面最近安装内可以看到模块帮我们自动安装编译工具
Electron必须使用python2.7,如果你电脑装了其他版本,需要自行百度设置

生成工具2017,使用node-gyp编译时需要设置—msvs_version=2017

4.node-gyp模块
使用此模块编译必须保证路径没有中文
//安装node-gyp编译工具,搭配windows-build-tools使用
npm install -g node-gyp
//MAC系统需要获取管理员权限
sudo npm install -g node-gyp
4.第三方模块
package.json配置依赖介绍
开发需要的模块:devDependencies(适合全局安装)
调用模块:dependencies(当前项目需要)
node-win-mouse模块
(安装简单,只限于win系统)
控制鼠标点击,移动,键盘输入
//当前安装,直接可以使用,缺点是只限于当前项目下,--save设置package.json依赖
npm install node-win-mouse --save
| 方法 | 用途 | 
|---|---|
| moveTo | 控制鼠标移动 | 
| leftDown | 左键按下 | 
| leftUp | 左键弹起 | 
| rightDown | 右键按下 | 
| rightUp | 右键弹起 | 
例子:
const WinMouse = require('node-win-mouse');
WinMouse.moveTo(0,0);  //鼠标移动到左上角位置
WinMouse.leftDown();
WinMouse.leftUp();
WinMouse.rightDown();
WinMouse.rightUp();
console.log(WinMouse);
robotjs模块
(这个安装比较坑,兼容win系统和MAC系统,包含node-win-mouse模块功能)
桌面自动化,获取屏幕颜色,获取鼠标移动位置,获取键盘输入,**控制鼠标点击,移动,键盘输入
官网更多骚操作:[https://github.com/octalmage/robotjs**](https://github.com/octalmage/robotjs)
函数手册:https://robotjs.io/docs/syntax
MAC报错:MAC Elecctron引入robotjs的坑
//--save意思是添加到package,json里"dependencies"
//安装到当前项目下
npm install robotjs --save
//需要重新编译才能使用require("robotjs")
var robot = require("robotjs");
// Speed up the mouse.
robot.setMouseDelay(2);
var twoPI = Math.PI * 2.0;
var screenSize = robot.getScreenSize();
var height = (screenSize.height / 2) - 10;
var width = screenSize.width;
for (var x = 0; x < width; x++)
{
    y = height * Math.sin((twoPI * x) / width) + height;
    robot.moveMouse(x, y);
}
robotjs重新编译**
//打开VS终端,进入到robotjs目录下
cd ./node_modules/robotjs
使用node-gyp编译
//在robotjs目录下输入命令,设置windows-build-tools模块版本-生成工具2017
node-gyp configure --msvs_version=2017
//编译
node-gyp build
报错一:binding.gyp

例子:编译net-ping模块出错,找不到binding.gyp文件
解决方案:发现在其他文件夹里,进入到有binding,gyp的文件再打开cmd编译即可成功
报错二:node.lib文件损坏

这个编译失败,是由于node.lib文件损坏。下载对应node版本的node.lib文件
下载(这个是我使用的版本):[https://nodejs.org/download/release/v12.13.0/win-x64/**](https://nodejs.org/download/release/v12.13.0/win-x64/)
附件:node.rar
node-gyp build 编译报错,把下载的node.lib文件替换(这里根据实际,不知道可以在C盘搜索node.lib文件)
解决方案,替换路径:C:\Users\Administrator\AppData\Local\node-gyp\Cache\8.2.1\x64\node.lib
出现这个报错:说明离成功很近!
错误:版本不一致!
72是电脑上的node版本,76是electron里的node版本。
这里比较坑的是你永远在node官网找不到跟electron对应版本号
必须使用electron-rebuild模块来设置node.js和electron版本一致
解决版本不一致的问题
NODE_MODULE_VERSION 72      本地的 electron版本 abi
NODE_MODULE_VERSION 76      文件里的  electron版本 abi     
要么改文件,要么改我的
这个是本机的,全局

https://www.cnblogs.com/mdorg/p/10419506.html
electron-rebuild模块(解决版本不一致)**
参考:如何正确引入第三方模块,解决Electron中模块编译失败问题
//下载electron-rebuild模块到当前项目,不建议全局安装
 npm install electron-rebuild  --save
方法一:
 //进入robotjs文件夹下编译
 cd node_modules
 cd robotjs
  ..\.bin\electron-rebuild.cmd
这个时候同样也会报错,把下载node.lib文件替换
官网下载(这里是我的版本号):https://nodejs.org/download/release/v12.13.0/win-x64/
下载附件:node.rar
解决方案,替换路径:C:\Users\Administrator.electron-gyp\8.2.1\x64
重新编译后没有报错就可以正常调用
node-ffi模块
调用C++
关于在electron中调用C++动态库的经验总结(安装会出现很多报错,这里提供了解决方案)
4.下面vue框架还在测试中~~做好看的UI界面
Electron-vue开发实战之Electron入门
这里需要的时间比较久
设置后能运行但是不能显示渲染进程
Electron-vue报错Webpack ReferenceError:process is not defined
解决报错后就可以.
定时任务  //安装成功,但是使用失败。。待续
https://blog.csdn.net/zhang767653317/article/details/59590522
5.连接安卓/手机(截图/控制系统)
下载adb:adb.zip
安卓模拟器(免root)
进入adb文件夹下,打开cmd
//查看当前搜索到的设备ip
adb devices
//offline —— 表示设备未连接成功或无响应。
//device —— 设备已连接/已连接模拟器。
//no device —— 没有设备/模拟器连接。
ADB连接手机(免root)
1、手机打开开发者选项/手机无需root
2、手机和电脑连入同一个无线网络
3、手机连接电脑,在命令行输入adb tcpip 5555
4、断开连接线,命令行输入adb connect 10.3.6.59(手机的IP地址在手机状态信息里查看)
5、提示连接成功后,可以进行无线调试了
6、手机截图并保存到我的电脑
//手机截图并保存到手机ip:192.168.1.100:5555
adb -s 192.168.1.100:5555 shell screencap -p /sdcard/screen.png
//从手机内存传输图片到我的电脑D盘
adb -s 192.168.1.100:5555 pull /sdcard/screen.png d:/screenshot.png
adb指令大全参考连接:http://blog.csdn.net/u010375364/article/details/52344120
//查看当前设备
adb devices
//offline —— 表示设备未连接成功或无响应。
//device —— 设备已连接。
//no device —— 没有设备/模拟器连接。
模拟器名称                        端口号
-------------------------------------
逍遥游                             21503
夜神模拟器                         62001 
海马玩模拟器                        26944 
网易mumu模拟器                     7555 
天天模拟器                         6555
BlueStacks                         5555
雷电安卓模拟器                       5555
天天安卓模拟器                       5037
安卓模拟器大师                       54001
Genymotion                          5555
======================
连接命令: adb connect 127.0.0.1:5555
adb.exe devices(查看设备连接情况)
adb kill-server
adb start-server
adb remount 
netstat 这个命令也能获得端口号
netstat |findstr 127.0.0.1(用这个直接输出需要的几行)
常用adb操作
1、如何把电脑上的文件或文件夹传到模拟器里面?
adb push D:/1.avi /mnt/avi/
2、如何把模拟器里面的文件或文件夹传到电脑上?
adb pull /mnt/avi/sex.avi D:/avi/
3、安装APK
adb install d:\\qq.apk
4、卸载APK
adb uninstall 包名
比如卸载QQ:adb uninstall com.tencent.mobileqq
5、PM包命令
1)获取模拟器所有包名
adb shell pm list packages
2)获取模拟器所有包名并且包括APK路径
adb shell pm list packages -f
3)获取包名对应的APK路径
adb shell pm path packageName
4)清理应用数据
adb shell pm clear packageName
6、启动应用
adb shell am start -n 包名/Activity类名
例子:启动应用宝:
adb shell am start -n com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity
指定模拟器启动动应用宝:
adb -s 127.0.0.1:5555 shell am start -n com.tencent.android.qqdownloader/com.tencent.assistant.activity.SplashActivity
7、关闭应用
adb shell am force-stop 包名
8、模拟输入
adb shell input text 字符串(不支持中文)
9、模拟按键
adb shell input keyevent 键值
10、模拟鼠标点击
adb shell input tap X Y
11、模拟鼠标滑动
adb shell input swipe X1 Y1 X2 Y2
12、截屏
adb shell screencap -p /sdcard/screencap.png
多设备调用命令,进入某个设备shell:adb -s 序列号 shell
这里对三个雷电模拟器分别进行了三次截图,然后储存在模拟器的文件夹中
使用Electron模拟输入cmd指令**
//把adb文件夹复制粘贴到项目里
//模拟打开cmd.exe,child_process模块是electron自带的
var exec = require('child_process').exec;
function execute(cmd){
        //在cmd内输入内容
    exec(cmd, function(error, stdout, stderr) {
        if(error){
            console.error(error);
        }
        else{
            console.log(cmd); //打印cmd输入内容
            console.log(stdout); //打印cmd输出结果
        }
    });
}
//调用adb,__dirname获取当前文件夹路径
var str = __dirname+'\\adb\\adb.exe '
//devices 查看当前连接设备
execute( str + 'devices');
- 这里只打开了一个雷电模拟器,用法与cmd一致,只需要输入adb命令即可操作模拟器

 
6.Electron打包应用
https://segmentfault.com/a/1190000013924153
https://blog.csdn.net/qq_33323731/article/details/80492191
7.PC端截图(win系统)
官网:http://www.nirsoft.net/utils/nircmd.html
nircmd-x64.zip
nircmd.exe savescreenshot "d:\tshot.png"
使用Electron模拟输入cmd指令
//index.html
<button id="按钮1">截图1</button>
//js代码
        document.getElementById('按钮1').addEventListener('click', function (event) {
            var exec = require('child_process').exec;
            function execute(cmd) {
                //在cmd内输入内容
                exec(cmd, function (error, stdout, stderr) {
                    if (error) {
                        console.error(error);
                    }
                    else {
                        console.log(cmd); //打印cmd输入内容
                        console.log(stdout); //打印cmd输出结果
                    }
                });
            }
            //截图
            let str = __dirname + '\\nircmd\\nircmd.exe' + ' '
            //__dirname=当前路径
            let modalPath = __dirname + '\\tshot.png'
            //这里要注意:输出路径必须加双引号"",单引号都不行
            execute(str + 'savescreenshot' + ' ' + "\"" + modalPath + "\"");
            console.log(modalPath)
        })
项目目录
  --nircmd目录
  --main.js
    --tshot.png
                    






