关于electron

本文详细介绍了如何利用JavaScript调用APIs,借助Electron创建桌面应用。主要内容包括:Electron的主进程和渲染进程、事件监听、菜单设置、用户任务、缩略图工具、进度条显示、文件操作、网络状态检测、进程通信、V8引擎、GPU加速、打包与发布、IPC通信、远程模块使用、以及各种对话框和通知的实现。此外,还提到了vue-electron脚手架和热更新方案。

用js调用apis来创造桌面应用,他专注于桌面应用而不是Web服务器
主要目录结构
|----- package.json
├── main.js(主要的)
└── index.html(展示的)

app.on(‘window-all-closed’, function() {})所有窗口关闭时
app.on(‘ready’, function() {})当electron完成初始化并创建浏览器窗口的时候
mainWindow.on(‘closed’, function() {})当 window 被关闭,这个事件会被发出
。。。还有好多

dockMenu=Menu.buildFromTemplate([])
app.dock.setMenu(dockMenu) 来设置你的菜单
app.setUserTasks([{},{}]) 来设置用户任务 传入空值时会清空任务列表
let win = new BrowserWindow({})
win.setThumbarButtons([{},{}])来设置缩略图工具
win.setProgressBar(0.5) 在unity运行器上显示进度条
window.setRepresentedFilename(’/etc/passwd’);
window.setDocumentEdited(true); 展示文件弹窗

electron在线、离线事件探测(navigator.onLine只有在脱机时才返回false其他都是true没法准确判断)

electron进程(electron中的process对象)
一个进程是计算机程序执行中的一个实例。
Electron 应用同时使用了 main (主进程) 和一个或者多个 renderer (渲染进程)来运行多个程序
。在 Node.js 和 Electron 里面,每个运行的进程包含一个 process 对象。这个对象作为一个全局的提供当前进程的相关信息,操作方法。作为一个全局变量,它在应用内能够不用 require() 来随时取到。
process.once(‘loaded’, function() {})在Electron已经加载了其内部预置脚本和它准备加载主进程或渲染进程的时候触发
process.hang()使当前进程的主线程挂起.
这个process相当于html里的windows

运行electron.exe,Electron 就会以你的应用程序的方式启动。electron 文件夹将被部署并可以分发给最终的使用者
将应用程序打包成一个文件
,打包应用程序为一个asar库文件避免暴露你的源代码
通过重新编译打包,来重命名electron名称

向APPstore提交向导
从apple获得证书、使用 Application Distribution 打包你的应用、准备好child.plist和parent.plit
两个授权文件、上传你的应用并检查提交

IPC 代表 Inter-Process Communication。Electron 使用 IPC 来在 [主进程] 和 [渲染进程] 之间传递 JSON 信息。

V8 是谷歌公司的开源的 JavaScript 引擎

main process主进程,通常是值 main.js 文件,是每个 Electron 应用的入口文件。
它控制着整个 APP 的生命周期,从打开到关闭。
它也管理着原生元素比如菜单,菜单栏,Dock 栏,托盘等。

两种渲染模式
GPU加速
软件输出设备(模式使用软件输出设备在CPU中渲染,因此帧生成速度更快,因此此模式优先于GPU加速模式。
要启用此模式,必须通过调用 app.disableHardwareAcceleration() API 来禁用GPU加速。)

electron开发
electron .运行 使用electron-package进行打包分布安装之后使用electron-package +打包项目路径+名称 --win(Windows系统)–out+(输出路径)

const {app,BrowserWindow} = require(‘electron’)
fuction createWindow(){
let win = new BrowserWindow({
width:100,height:100,
webPreference:{nodeIntegeration:true} //启用node相关的东西
enableRemoteModule:true //配置下面的remote模块可以使用
})
require(‘引入某个文件(菜单文件)’)
win.loadFile(‘index.html’) //也可以防止某个链接
mainWindow.webContents.openDevTools() //打开界面的时候打开调试者工具
}
app.whenReady().then(createWindow)

打包完之后可以直接发给别人用,就完成了

remote模块
const BrowserWindow = require(‘electron’).remote.BrowserWindow
let newWin = new Browser({}) //可以在主进程下创建一个新的窗口,同时也可以使用主进程中的方法
渲染进程(index.html里的基本上都是)也不是主进程,用到remote的都要remote.去引用有的没得方法
只要是在第一个界面就是主进程不需要remote创建页面,不是在第一个界面需要remote创建

引入菜单
const {Menu} = require(‘electron’)
let template = [
{label:‘11’,submenu:[{label:’’,click:()=>{}},{label:’’,click:()=>{}}]}, //添加子菜单并添加事件
{label:’’,submenu:[{label:’’,accelerator:‘ctrl+n’}]} //accelerator设置快捷键
]
//编辑菜单
引入菜单
let m = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(m)

右键菜单(右键的话是渲染进程要用到remote模块)
let m = remote.Menu.buildFromTemplate(…)
window.addEventListener(‘contextmenu’,function(){ //context就是右键你敢信
e.preventDeafult()
m.popup({window:remote.getCurrentWindow()}) //右键菜单
})

通过连接打开浏览器
不是点击a标签在这个窗口打开,而是在浏览器
const {shell} = require(‘electron’)
前面js的都不写了
shell.openExternal(href) 就OK

嵌入网页和打开子窗口
在主进程中
let BrowserView = electron.BroswerView //引入BroswerViews
let view = new BroswerView()
mainWindow.setBrosweView(view)
view.setBounds({x:0,y:0,width:1000,height:1000}) //为嵌入网页设置坐标及大小
view.webContents.loadURL(’’) //嵌入网页渲染url
点击事件的时候window.open() //即可打开子窗口

点击子窗口向父窗口传递信息
window.opener.postMessage(data,targetOrigin:传递给哪个父窗口(默认都传))
父窗口获取发出的信息
window.addEventListener(‘message’,(msg)=>{})

文件对话框(打开的是类似于上传文件的那个窗口)
dialog.showOpenDialog({ 打开一个对话框
title:’’//标题,
defaultPath:’’//默认打开路径,
filters:[{name:‘img’,extensions:[‘jpg’]}] //过滤器只找extension的,
buttonLabel:’’//打开按键,

}) .then(result=>{
let image = document.getElementById(‘images’)
images.setAttribute(‘src’,result.filePath[0])
})
设置某个有src的元素src时要这样

保存文件对话框使用
dialog.showSaveDialog({
和前面参数一样的
}).then(()=>{
fs.writeFileSync(result.filePath,‘要保存的内容’) //使用node里的fs操作写入文件,sync同步
}).catch(err=>{})

消息对话框操作,只讲基础属性
dialog.showMessageBox({
type:‘warning’,
title:’’,
message:’’,
buttons:[‘一个按钮’,‘两个按钮’] ,–返回数组下标形式
}).then(result=>{
})
就是经常看到的消息对话框

断网提醒功能(监听online和offline事件)
window.addEventListener(‘online’,function(){})
window.addEventListener(‘offline’,function(){alert()})

底部消息通知
let option = {
title:’’,
body:‘来了来了’
}
new window.Notification(option.title,option)

注册全局快捷键(像crtl+f一样)
let globalShortcut = electron.globalShortcut
//他必须写在on ready进程里面
globalShortcut.register(‘ctrl+e’,()=>{})

剪切板功能

const {clipboard} = require(‘electron’) //复制文字,图片什么的都可以
clipboard.writeText(code.innerHTML) //实现复制文字

ipcMain
从主进程到呈现程序进程异步通信
ipcmain.on(’’,(event,arg)=>{event.sender.send(’’)})

vue-electron脚手架
安装vue init simulatedgreg/electron-vue

通过electron-builder和electron-updater进行热更新
或者安装electron-reloader,在主进程js中require进来

webpack并不会对window对象进行编译
getCurrentWindow().minimize() 页面最小化.maximize()页面最大化

效果图:音乐播放控制按钮 教程开始: 实现方法在微软的帮助文档中,我发不了链接(百度关键词 任务栏扩展 MSDN) 文档中提供了3三个API:ThumbBarAddButtons(创建按钮)、 ThumbBarSetImageList、 ThumbBarUpdateButtons(更新按钮) 这三个API在动态链接库 Explorerframe.dll 中,我尝试过直接调用它们,结果却不存在。 不过MSDN中提供了C++的调用方法,在C++中这三个API被封装在 ITaskBarList3 类中,ITaskBarList3类定义在“ Shobjidl.h ”头文件 所以我想想到个方法,利用微软提供的C++代码编写一个DLL库来实现这三个方法,让易语言程序调用。 接下来我编写了 TaskBarEx.dll 这个链接库(C++源码在最下面),里面提供了 AddThumbarButtons 这个方法,方法易语言定义如下: 复制代码 .版本 2 .DLL命令 AddThumbarButtons, 整数型, "TaskBarEx", "_AddThumbarButtons@12", 公开 .参数 句柄, 整数型 .参数 sum, 整数型 .参数 pTHUMBBUTTON, THUMBBUTTON, 数组 这个链接库的代码都是MSDN中现成的,从微软的帮助文档复制过来,稍加修改就行了。 你们以为这样就结束了! 当我在易语言中声明此API调用后,才发现并没有什么卵用,我也不知道为什么。后面才知道微软提供的这三个API是用COM对象的方式调用的。于是 我在论坛中找了一大堆关于如何调用COM对象的教程,完全看不懂! 当然!什么事情都是有解决的办法的,最终我还是找到办法了,以下方法是我乱搞搞出来的。 我在易语言中创建了一个“对象”类型的变量(用来调用COM对象的)取名: ITAskBarList3并创建了 ITAskBarList3类的COM对象 复制代码 ITAskBarList3.创建 (“{56FDF344-FD6D-11d0-958A-006097C9A090}”, ) 代码中那一串文本是COM对象的唯一标识符,我在VS2017中 ITAskBarList3类的声明中找得到。定义在“ Shobjidl.h ”头文件中。 然后声明了一个THUMBBUTTON 结构(见MSDN),定义按钮的信息: 复制代码 .版本 2 ' 按钮1 Button.hIcon = LoadIconA (mHwnd, 112)' 112为“上一首按钮”的图标在TaskBarEx.dll链接库的资源编号 Button.dwMask = 位或 (2, 4, 8)' 表示你准备使用THUMBBUTTON结构中的哪些成员 Button.iId = 0' 按钮的编号,用于在窗口的消息循环中的WM_COMMAND消息下判断是哪个按钮 Button.dwFlags = 0' 表示按钮状态,可用还是禁用,0表示可用 wtext = Ansi转Unicode (“上一首”)' 按钮提示文本需要Unicode类型 toBytes (Button.szTip, wtext, 取字节集长度 (wtext)) 加入成员 (sButton, Button)' 声明好一个按钮结构就加sButton数组 最后调用TaskBarEx.dll中我提供的AddThumbarButtons函数 复制代码 AddThumbarButtons (窗口句柄, 1, sButton) 以上就是创建一个缩略图按钮的基本代码。下面还有一些问题: 以下是MSDN的原话: 注意 当应用程序显示窗口时,系统会创建其任务栏按钮。当按钮就位时,任务栏会向窗口发送TaskbarButtonCreated消息。它的值通过调用RegisterWindowMessage(L(“TaskbarButtonCreated”))计算。该消息必须在应用程序调用任何ITaskbarList3方法之前接收。 意思就是创建按钮的所有代码都在TaskbarButtonCreated消息之后,并且这个消息值需要我们调用API自己注册。我做过测试,发现要想在窗口创建完成后创建按钮,就必须这样做;如果将创建按钮代码放在 __按钮__被按下事件 下就不一定,不知道为什么。 教程结束 当然还有一些细节问题需要处理,在我的源码中都有注释,可以看看。如果代码看不懂可以问我,不过关于COM对象的问题我也不懂。 TaskBarEx.dll的源代码:整个VC++工程目录100多MB,无语了,如果需要我后面再发;下面两个主要函数代码,其实MSDN都有。 我用的是VS2017 EXTERN_C __declspec(dllexport) int _stdcall eG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值