Electron实战之菜单与托盘

news2025/1/19 3:14:50

菜单、托盘是桌面端应用必备的功能之一,我们通常会在菜单上配置应用常用的:偏好设置、显示隐藏、打开文件等功能,在托盘内设置:退出、重启、帮助等辅助性功能,帮助用户方便快捷地控制应用的一些系统功能。系统托盘实际上也是一个菜单,通过点击鼠标触发。

一、应用菜单(Menu)

Electron 里的菜单大体上分为三类:应用菜单、上下文菜单和 Dock 菜单(仅针对 OSX 系统)。这里以 VSCode 为例,来分别介绍这几种菜单的含义。打开 VSCode 编辑器,可以通过下图,很清晰地发现 3 个菜单所处的位置。

图片

图片

1.1 应用内菜单

原生应用菜单可以理解为应用窗口菜单,在 MacOS 上,选中应用后,应用内菜单出现在桌面的左上方。在 Windows 和 Linux 上,Menu 将会被设置成窗口顶部菜单。在 Electron 中,通常会使用 Menu.setApplicationMenu(menu) 函数来设置应用内菜单。

import { Menu } from 'electron'

function createMenu () {
  const template = [
    {
      label: '菜单一',
      submenu: [
        {
          label: '功能一'
        },
        {
          label: '功能二'
        }
      ]
    },
    {
      label: '菜单二',
      submenu: [
        {
          label: '功能一'
        },
        {
          label: '功能二'
        }
      ]
    }
  ];
  const menu = Menu.buildFromTemplate(template);
  Menu.setApplicationMenu(menu);
}

通过以上代码设置完成一个应用菜单后,在 macOS 下的效果如下。

图片

可以看到第一个菜单的标题是 Electron 而不是我们设置的标题 菜单一。这是因为:在 macOS 中应用程序菜单的第一个项目的标签总是你的应用程序的名字,无论你设置什么标签。如果你想展示成自己的标题,Electron 官方给了一种修改 Info.plist 的方法:About Information Property List Files。除此之外,你也可以重新修改一下 template 的格式:

if (process.platform === 'darwin') {
  template.unshift({
    label: app.getName(),
    submenu: [
      {
        label: 'Quit',
        click() {
          app.quit();
        }
      }
    ]
  });
}

这样,三个菜单就显示出来了,如下图所示。

图片

上述代码中,对于 template 菜单项字段内有很多配置项,具体的字段也可以直接阅读官方文档,针对每个字段都有详细的解释。

1.2 上下文菜单(context menu)

上下文菜单(context menu)就是我们通常说的右键菜单,需要注意的是:上下文菜单,需要在渲染进程中进行实现,可以通过 IPC 发送所需的信息到主进程,并让主进程代替渲染进程显示菜单,示例代码如下。

// 主进程 main/index.js
ipcMain.on('show-context-menu', (event) => {
  const template = [
    {
      label: '菜单一',
      click: () => {
        // 发送点击菜单一事件到渲染进程
        event.sender.send('context-menu-command', 'menu-item-1')
      }
    },
    { type: 'separator' },
    {
      label: '菜单二',
      type: 'checkbox',
      checked: true
    }
  ]
  const menu = Menu.buildFromTemplate(template)
  menu.popup({
    window: BrowserWindow.fromWebContents(event.sender)
  })
})
// 渲染进程 renderer/main.js
window.addEventListener("contextmenu", (e) => {
  e.preventDefault();
  electron.ipcRenderer.send("show-context-menu");
});
electron.ipcRenderer.on("context-menu-command", (e, command) => {
  // todo
});

最终的运行效果如下图。

图片

1.3 Dock 菜单(仅 MacOS 可用)

Dock 的菜单实现也是在主进程中,可以通过 app.dock.setMenu 这个 API 来直接创建。

// main.js
const createDockMenu = () => {
  const dockTempalte = [
    {
      label: '菜单一',
      click () {
        console.log('New Window');
      }
    }, {
      label: '菜单二',
      submenu: [
        { label: 'Basic' },
        { label: 'Pro' }
      ]
    },
    {
      label: '其他...'
    }
  ];

  const dockMenu = Menu.buildFromTemplate(dockTempalte);
  app.dock.setMenu(dockMenu);
}

运行效果如下图。

图片

二、应用托盘(Tray)

实现应用托盘主要依托于 Electron 的 Tray 模块,在 MacOS 和 Ubuntu,托盘将位于屏幕右上角上,靠近你的电池和 wifi 图标。在 Windows 上,托盘通常位于右下角。

图片

通过以上图片可以清晰地看到创建一个托盘需要准备一个图标用于显示,以及一个菜单项用于呈现所需的功能菜单。我们来看一下 Windows 下一个简单的应用托盘的实现方式:

// 主进程
import {app, Menu, Tray} from 'electron';

let tray = new Tray('public/icon.ico');
const contextMenu = Menu.buildFromTemplate([
  {
    label: '退出',
    click: function(){
      app.quit();
    }
  }
]);
tray.setToolTip('应用标题');
tray.setContextMenu(contextMenu);

在 Rubick 中,应用托盘实现的源码链接:GitHub - rubickCenter/rubick: 🔧 Electron based open source toolbox, free integration of rich plug-ins. 基于 electron 的开源工具箱,自由集成丰富插件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#,dotnet, DataMatrix 类型二维码深度识别,OCR,(基于 Halcon)

代码中部分调用的 c 函数参数,具体说明自行研究~(我也是参考的其他资源,还没研究透彻) 例如:HOperatorSet.GenRectangle2() , 2000, 2000, 0, 2000, 2000 这些数字应该是选取的图片解析范围、尺寸&#xff…

Programming Abstractions in C阅读笔记:p283-p292

《Programming Abstractions in C》学习第72天,p283-p292总结,总计10页。 一、技术总结 1、anylasis of algorithms 算法分析——即判断程序的效率(efficiency)。 2、mathematical induction(数学归纳法) 3、Big-O notation(大O标记法) 4、constan…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

MySQL的连接

MySQL的连接 大纲 基本操作 具体案例 MySQL的三层结构

毕业设计:基于知识图谱的《红楼梦》人物关系可视化

文章目录 项目介绍部署步骤项目运行 项目介绍 github地址:https://github.com/chizhu/KGQA_HLM?tabreadme-ov-file 基于知识图谱的《红楼梦》人物关系可视化:应该是重庆邮电大学林智敏同学的毕业设计,在学习知识图谱的过程中参考使用。 文…

WebGL开发数据可视化应用

使用WebGL进行数据可视化可以创造出令人印象深刻的交互式和动态图形。以下是一些在WebGL中开发数据可视化应用时需要考虑的步骤和技术,希望对大家有所帮助。 1.选择合适的WebGL框架或库: 使用现有的WebGL框架或库,如Three.js、Babylon.js、r…

云HIS定义,云HIS系统源码,云HIS建设方法,云HIS发展机制

一、重新定义HIS: 传统HIS是基于局域网的医院信息系统,云HIS全称为基于云计算的医疗卫生信息系统(Cloud-Based Healthcare Information System),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫…

解决ModuleNotFoundError: No module named ‘pysqlite2‘

目录 一、问题描述: 二、问题分析: 三、问题解决: 四、参考文章: 一、问题描述: 在重新安装的anaconda环境中自建了一个新虚拟环境,再安装完jupyter后(pip install jupyter)&am…

图的遍历(广度优先遍历BFS,深度优先遍历DFS)

目录 图的遍历概念: 图的广度优先遍历(BFS): 代码实现如下: 测试如下: 注意: 图的深度优先遍历(DFS): 代码实现如下: 测试如下&#xff1…

HTML 字符实体参考清单

前言 一些字符在 HTML 中是预留的&#xff0c;拥有特殊的含义&#xff0c;比如小于号‘<’用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符&#xff0c;我们必须在 HTML 源码中插入字符实体。 字符实体有三部分&#xff1a;一个和号‘&’和一个实体名…

护眼台灯哪个牌子好?揭秘多款热销护眼台灯品牌

现在不管是学生党学习阅读&#xff0c;还是办公族加班工作&#xff0c;都离不开一盏光源舒适的台灯&#xff0c;然而如今的台灯市场水实在太深的&#xff0c;各种网红、劣质产品混杂在其中&#xff0c;一不留神就踩雷了。这类低质量的台灯往往采用劣质电源&#xff0c;其电源品…

怎么在抖音带自己的货?带货方式和带货要求,如下所示

我是王路飞。 不管你是无货源的新手小白&#xff0c;还是有货源的厂家/供应链&#xff0c;想在抖音卖货的话&#xff0c;无非就两种方式&#xff1a;要么开店、要么开直播带货。 看似都是在抖音卖货&#xff0c;但其实这是两条不同的赛道。 这篇文章就给你们聊下想在抖音卖货…

PTA——7-31 三角形判断

7-31 三角形判断 (15分) 给定平面上任意三个点的坐标(x​1​​,y​1​​)、(x​2​​,y​2​​)、(x​3​​,y​3​​)&#xff0c;检验它们能否构成三角形。 输入格式: 输入在一行中顺序给出六个[−100,100]范围内的数字&#xff0c;即三个点的坐标x​1​​、y​1​​、x​2​…

详解-领航家政策/双2.0模式

#领航家代理政策怎么代理# ∨&#xff1a;ok1234vip 简单点说&#xff01;费率/分润和返现先不说了&#xff0c;领航家是双2.0平台&#xff0c;用户也可以参与其中拼团&#xff0c;费率随之降低能一直降至0费率&#xff0c;甚至可以赚钱&#xff0c;&#xff08;这就是拼团两人…

OpenCV人脸检测案例实战

人脸检测是一种计算机视觉技术&#xff0c;旨在识别图像或视频中的人脸。这项技术的基本内容包括使用特定的算法和模型来定位和识别人脸&#xff0c;通常涉及在图像中寻找面部特征&#xff0c;如眼睛、鼻子、嘴巴等&#xff0c;以便准确地确定人脸的位置和边界。人脸检测技术的…

构造分钟降水R01文件

格式为&#xff1a;四川省降水强度数据集 目的&#xff1a;主要练习提取降水强度&#xff0c;而创建随机的分钟降水文件。 处理&#xff1a; 雨量筒降水不需要&#xff0c;统一处理为666666。 无降水与缺测&#xff08;标志2&#xff0c;3&#xff09;增加出现概率&#xf…

.NET 9 首个预览版发布:瞄准云原生和智能应用开发

前言 前不久.NET团队发布了.NET 9 的首个预览版&#xff0c;并且分享.NET团队对 .NET 9 的初步愿景&#xff0c;该愿景将于今年年底在 .NET Conf 2024 上发布。其中最重要的关注领域是&#xff1a;云原生和智能应用开发。 云原生开发人员平台 过去几年&#xff0c;.NET团队一…

在四维轻云中,如何实现地理空间数据云管理?

四维轻云是一款轻量化的地理空间数据网页管理平台&#xff0c;支持倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)和数字高程模型(dem)等多种地理空间数据的在线管理、编辑及分享&#xff0c;其他类型地理空间数据也将陆续上线。 目前&#xff0c;平台具有项目管理、数据上传…

苹果打破App Store垄断,允许第三方应用商店存在 /马斯克的Neuralink首次成功植入芯片 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 苹果打破App Store垄断&#xff0c;允许第三方应用商店存在&#xff0c;但开…

关于SQL的各种Join你知道多少?

SQL中的 join&#xff0c;无外乎 inner join、outer join 以及 cross join&#xff0c;而 inner join 其实就是我们熟知的 join&#xff0c;outer join 其实就是 left outer join、right outer join 和 full outer join。 inner join 通过连接键列中的值进行匹配&#xff0c;…