electron 创建托盘应用
在Electron中我们创建一个托盘需要如下几个文件:
1. main.js 用来存放应用代码。
2. 一张PNG格式的图片用作应用图标。
3. 一个package.json文件用来描述应用配置。
下面是我们项目的目录架构如下:
|--- electron-demo5
| |--- node_modules
| |--- app.css
| |--- app.js
| |--- main.js
| |--- icon@2x.png
| |--- index.html
| |--- package.json
index.html 是用来展示笔记的内容,如下html代码:
<html>
<head>
<title>tray-app-electron</title>
<link href="./app.css" rel="stylesheet" />
</head>
<body>
<h1 id="app"></h1>
<div id="contents"></div>
<script type="text/javascript" src="./app.js"></script>
</body>
</html>
package.json 代码如下:
{
"name": "tray-app-electron",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
},
"author": "kongzhi",
"license": "ISC",
"dependencies": {
"electron": "^6.0.0"
}
}
main.js 代码如下:
'use strict';
const { app, Menu, Tray, BrowserWindow } = require('electron')
let appIcon = null;
let mainWindow = null;
const notes = [
{
title: 'todo list',
contents: '111111'
},
{
title: 'xxxxx',
contents: '2222'
}
];
function displayNote (note) {
// 使用 webContents API 向浏览器窗口发送数据来显示笔记内容
mainWindow.webContents.send('displayNote', note);
}
function addNoteToMenu (note) {
return {
label: note.title,
type: 'normal',
click: () => {
displayNote(note);
}
}
}
app.on('ready', () => {
// 创建一个带图标的托盘应用
appIcon = new Tray('icon@2x.png');
// 为托盘应用创建上下文菜单,对笔记进行迭代并添加为菜单项
let contextMenu = Menu.buildFromTemplate(notes.map(addNoteToMenu));
appIcon.setToolTip('Notes app');
// 将上下文菜单绑定到托盘应用上
appIcon.setContextMenu(contextMenu);
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
// 添加如下代码 可以调试
mainWindow.webContents.openDevTools();
mainWindow.loadURL(`file://${__dirname}/index.html`);
// 当应用视窗加载好后,默认显示第一个笔记内容
mainWindow.webContents.on('dom-ready', () => {
displayNote(notes[0]);
});
});
如上代码就创建了一个托盘应用,以及它的菜单, 同时BrowserWindow负责显示笔记内容,当我们的菜单笔记项被单击的时候,就会调用我们的 app.js 代码如下的函数:
function displayNote(event, note) {
document.getElementById("app").innerText = note.title;
document.getElementById("contents").innerText = note.contents;
}
// Electron 的 ipcRenderer模块监听由后端进程触发的事件
const ipc = require('electron').ipcRenderer;
/*
菜单项被单击或当应用加载的时候,ipcRenderer模块会接收到事件以及note对象并将其
传递给 displayNote 函数
*/
ipc.on('displayNote', displayNote);
如上代码,会使用 electron中的ipcRenderer模块来接收displayNote事件以及由main进程传递给renderer进程的note对象。这样我们就可以在 BrowserWindow 进程中更新HTML内容了。
electron的ipcRenderer模块可以发送以及接收来自或传递给Electron main 进程的数据,在托盘应用上下文中,后端进程通过 web contents API将数据传递给浏览器视窗,因此, displayNote事件以及note对象由后端传递给前端,ipcRenderer则监听该事件。当事件触发的时候,ipcRenderer会获取到note对象并将其传递给负责将笔记内容插入到html的函数。
当我们运行 electron . 的时候,我们会在我们的mac系统顶部有一个图标,如下所示:

同时也会打开一个托盘这样的,如下图所示:

当我们点击图标的时候,它会有一个列表,如下图所示:

当我们点击 xxx 列表项的时候,托盘内容就会显示 xxxx 对应的内容了,如下图所示:

当我们切换到 todo list 列表的时候,就会显示 todo list 对应的内容了,如下图所示:

更多的系统托盘知识,请看官网API (https://electronjs.org/docs/api/tray)
electron 创建托盘应用的更多相关文章
- Electron - 创建跨平台的桌面客户的应用程序
Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...
- (译)通过 HTML、JS 和 Electron 创建你的第一个桌面应用
原文:Creating Your First Desktop App With HTML, JS and Electron 作者:Danny Markov 近年来 web 应用变得越来越强大,但是桌面 ...
- Electron 创建一个空白的界面
添加应用 首先添加一个Lorikeet版本的Electron应用. 'use strict' const electron = require('electron'); const app = ele ...
- nodejs electron 创建桌面应用
//首先安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org //使用cnpm进行安装,使用方法和npm相同 cn ...
- electron 创建右键菜单
1.引入模块 const Electron = require('electron'); const remote = Electron.remote; const Menu = remote.Men ...
- electron 创建窗口2
/** * 窗口管理类,单例,负责创建所有窗口,保存窗口实例 */ const path = require('path'); const os = require('os'); const EucW ...
- electron创建窗口常用配置参数
{ "width": 800,//指定窗口的宽度,单位: 像素值. 默认是 800 "height":600,//指定窗口的高度,单位: 像素值,. 默认是 6 ...
- electron 系统托盘 单击 双击事件冲突解决方法
部分代码 // 任务栏点击事件 let timeCount = 0 tray.on('click', function (Event) { setTimeout(() => { if (time ...
- 【Electron】Electron开发入门(二):创建项目Hello Word
创建简单的Electron程序 1.首先,切换到你的项目空间,我的在 D:\ProjectsSpace\ElectronProjects\ElectronTest,ElectronTest是案例项目文 ...
随机推荐
- 物联网架构成长之路(45)-容器管理平台Rancher
0.前言 按照上一篇博客,我已经把需要下载的rancher docker 依赖镜像下载上传到Harbor了. 1. 安装 执行如下,实现一键安装 docker run -d --restart=unl ...
- 数据持久化之bind Mounting
一.默认情况 1.创建一个Nginx测试镜像 Dockerfile: FROM nginx:latest WORKDIR /usr/share/nginx/html COPY index.html i ...
- Kubernetes 中的服务发现与负载均衡
原文:https://www.infoq.cn/article/rEzx9X598W60svbli9aK (本文转载自阿里巴巴云原生微信公众号(ID:Alicloudnative)) 一.需求来源 为 ...
- mysql error 1364 Field doesn't have a default values
https://stackoverflow.com/questions/15438840/mysql-error-1364-field-doesnt-have-a-default-values. us ...
- C#, CSV,Generic, 泛型,导出
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- C#,二分法,BinarySearch()
static int BinarySearch(int[] arr,int key,int low,int high) { low = 0;high = arr.Length - 1; while(l ...
- [转载].NET ASP.NET 中web窗体(.aspx)利用ajax实现局部刷新
之前开发的一套系统中用到了大量的 checkboxList 控件,但是每次选定之后都会刷新整个页面,用户体验很差,百度了之后查到这篇文章,尝试了一下可以实现,所以转载了过来,记录一下,也给其他有相同困 ...
- Python struct与小端存储
参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080 在使用Python 实现字符向字节数据类型转换的时候,P ...
- 阿里Jvm必问面试题及答案
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被设计 ...
- Lambda(一)lambda表达式初体验
Lambda(一)lambda表达式初体验 Lambda引入 : 随着需求的不断改变,代码也需要随之变化 需求一:有一个农场主要从一堆苹果中挑选出绿色的苹果 解决方案:常规做法,source code ...