Electron中文手册
  • 文档概述
  • 开发指南目录
  • 构建说明(Linux)
  • 构建说明(macOS)
  • 构建说明(Windows)
  • 构建系统概述
  • 编码规范
  • 在 macOS 中调试
  • 在 Windows 中调试
  • 在C ++代码中使用clang-format
  • 在调试器中设置符号服务器
  • 源代码目录结构
  • Chrome升级清单
  • Chromium 开发指南
  • V8 开发指南
  • 教程目录
    • 关于 Electron
    • Electron 版本说明
    • API弃用说明
    • 快速入门
    • 支持的平台
    • 桌面环境集成
    • 系统通知
    • 离屏渲染
    • 在线/离线事件检测
    • 多线程
    • REPL
    • 键盘快捷键
    • DevTools扩展
    • 使用原生模块
    • 使用 Pepper Flash 插件
    • 使用 Selenium 和 WebDriver
    • 使用 Widevine CDM 插件
    • 应用分发
    • 应用打包
    • 主进程调试
    • 使用 node-inspector 进行主进程调试
    • 使用 VSCode 进行主进程调试
    • Mac App Store应用提交指南
    • Windows App Store应用提交指南
    • 安全,本地功能和你的责任
    • Headless CI Systems 测试
  • API接口目录
    • API接口之公用接口
      • 应用语言
      • 开发概要
      • 专业术语
      • 常见问题
      • 环境变量
      • 快捷键字符串
      • 命令行
      • 客户端请求
      • 剪贴板
      • <File> H5 File文件操作
      • 无框窗口
      • <window.open> window.open打开新窗口或打开时传递消息
      • 沙盒选项
    • API接口之主进程接口
      • 整体控制
      • 全局快捷键
      • 图标创建与应用
      • 屏幕
      • 窗口
      • 菜单
      • 菜单项
      • 系统托盘
      • 网页内容
      • 从主进程到渲染进程的异步通信
      • 对话框
      • 创建和控制视图
      • 会话
      • 会话,缓存和代理等控制
      • 页面请求
      • HTTP/HTTPS请求处理
      • 协议的注册和处理
      • 使用系统默认应用程序管理文件或URL
      • 下载项管理
      • 进程控制
      • Chromium原生网络库
      • 获取系统首选项
      • 电源状态
      • 节能管理
      • 调试工具
      • 奔溃报告
      • 性能数据收集
      • 自动更新
      • TouchBar触摸条
      • TouchBar触摸条按钮
      • TouchBar触摸条拾色器
      • TouchBar触摸条分组
      • TouchBar触摸条scrubber
      • TouchBar触摸条分段控件
      • TouchBar触摸条label标签
      • TouchBar触摸条弹出框
      • TouchBar触摸条滑块
      • TouchBar触摸条间隔符
    • API接口之渲染进程接口
      • 页面渲染
      • <webview> webview标签
      • 渲染进程与主进程通信
      • 从渲染进程到主进程的异步通信
      • 子窗口
      • 捕获桌面资源
  • 结构列表
    • 蓝牙设备对象
    • 证书对象
    • 证书主体对象
    • Cookie对象
    • 崩溃报告对象
    • 桌面捕获源对象
    • 显示器对象
    • 打印机信息对象
    • 文件过滤器对象
    • 最近使用的项目
    • 常用列表项
    • CPU使用率对象即程序占用的CPU资源
    • IO值对象
    • 内存信息对象
    • 进程内存信息对象
    • 内存使用详细信息
    • Mime类型缓冲区
    • 矩形对象
    • 删除客户端证书对象
    • 删除密码对象
    • Scrubber项对象
    • 分段控制对象
    • 快捷方式对象
    • 任务对象
    • 缩略图工具栏按钮对象
    • 上传blob对象
    • 上传数据对象
    • 上传文件系统对象
    • 上传文件对象
    • 上传原始数据对象
Powered by GitBook
On this page
  • 本文介绍:菜单
  • new Menu()
  • 静态方法
  • 实例方法
  • 实例属性
  • 例子
  • 主进程
  • 渲染进程
  • macOS应用程序菜单注意事项
  • 标准菜单
  • 标准菜单项操作
  • 主菜单的名称
  • 设置特定浏览器窗口的菜单 (Linux Windows)
  • 菜单项位置
  • 示例

Was this helpful?

  1. API接口目录
  2. API接口之主进程接口

菜单

Previous窗口Next菜单项

Last updated 4 years ago

Was this helpful?

本文介绍:菜单

创建应用程序菜单和上下文菜单

进程:

new Menu()

用途:创建新菜单

静态方法

Menu.setApplicationMenu(menu)

用途:设置应用菜单(在macOS中为应用菜单,Windows 和 Linux中为窗口顶部菜单)

  • menu Menu

    注意: 这个API必须置于 app 模块的 ready之后.

Menu.getApplicationMenu()

用途:获取应用菜单

如果应用没有菜单的话,返回 null.有则返回菜单 Menu ,请注意,该返回菜单 Menu实例不支持动态添加或删除菜单项.但 还是仍然支持动态修改.

Menu.sendActionToFirstResponder(action) macOS

用途:模拟 Cocoa 菜单的默认行为,发送 action 给应用的第一个响应器

  • action String

Menu.buildFromTemplate(template)

用途:从 template中创建菜单

  • template MenuItemConstructorOptions[]

实例方法

menu.popup([browserWindow, options])

用途:在指定位置( x, y)弹出菜单

  • browserWindow BrowserWindow (可选) - 默认为聚焦窗口.

  • options Object(可选)

    • x Number (可选) - 当前光标的 x ,默认为 -1.

    • y Number (如果存在 x,则该项必须) -当前光标的 y.

    • async Boolean (可选) - 同异步设置, true为同步即立即返回调用, false则是选菜单被择或关闭等操作后返回, 默认为 false.

    • positioningItem Number (可选) macOS - 在指定坐标鼠标位置下面的菜单项的索引. 默认为 -1.弹出此菜单作为browserWindow中的上下文菜单.

menu.closePopup([browserWindow])

用途:关闭 browserWindow中打开的上下文菜单

  • browserWindow BrowserWindow (可选) - 默认为聚焦窗口.

menu.append(menuItem)

用途:将 menuItem附加到菜单

  • menuItem MenuItem

menu.insert(pos, menuItem)

用途:将 menuItem插入到菜单的 pos位置

  • pos Integer

  • menuItem MenuItem

实例属性

menu.items

例子

主进程

在主进程中创建应用程序菜单的示例:

const {app, Menu} = require('electron')

const template = [
  {
    label: 'Edit',
    submenu: [
      {
        role: 'undo'
      },
      {
        role: 'redo'
      },
      {
        type: 'separator'
      },
      {
        role: 'cut'
      },
      {
        role: 'copy'
      },
      {
        role: 'paste'
      },
      {
        role: 'pasteandmatchstyle'
      },
      {
        role: 'delete'
      },
      {
        role: 'selectall'
      }
    ]
  },
  {
    label: 'View',
    submenu: [
      {
        role: 'reload'
      },
      {
        role: 'forcereload'
      },
      {
        role: 'toggledevtools'
      },
      {
        type: 'separator'
      },
      {
        role: 'resetzoom'
      },
      {
        role: 'zoomin'
      },
      {
        role: 'zoomout'
      },
      {
        type: 'separator'
      },
      {
        role: 'togglefullscreen'
      }
    ]
  },
  {
    role: 'window',
    submenu: [
      {
        role: 'minimize'
      },
      {
        role: 'close'
      }
    ]
  },
  {
    role: 'help',
    submenu: [
      {
        label: 'Learn More',
        click () { require('electron').shell.openExternal('http://electron.atom.io') }
      }
    ]
  }
]

if (process.platform === 'darwin') {
  template.unshift({
    label: app.getName(),
    submenu: [
      {
        role: 'about'
      },
      {
        type: 'separator'
      },
      {
        role: 'services',
        submenu: []
      },
      {
        type: 'separator'
      },
      {
        role: 'hide'
      },
      {
        role: 'hideothers'
      },
      {
        role: 'unhide'
      },
      {
        type: 'separator'
      },
      {
        role: 'quit'
      }
    ]
  })
  // 编辑菜单
  template[1].submenu.push(
    {
      type: 'separator'
    },
    {
      label: 'Speech',
      submenu: [
        {
          role: 'startspeaking'
        },
        {
          role: 'stopspeaking'
        }
      ]
    }
  )
//窗口菜单
  template[3].submenu = [
    {
      label: 'Close',
      accelerator: 'CmdOrCtrl+W',
      role: 'close'
    },
    {
      label: 'Minimize',
      accelerator: 'CmdOrCtrl+M',
      role: 'minimize'
    },
    {
      label: 'Zoom',
      role: 'zoom'
    },
    {
      type: 'separator'
    },
    {
      label: 'Bring All to Front',
      role: 'front'
    }
  ]
}

const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)

渲染进程

<!-- index.html -->
<script>
const {remote} = require('electron')
const {Menu, MenuItem} = remote

const menu = new Menu()
menu.append(new MenuItem({label: 'MenuItem1', click() { console.log('item 1 clicked') }}))
menu.append(new MenuItem({type: 'separator'}))
menu.append(new MenuItem({label: 'MenuItem2', type: 'checkbox', checked: true}))

window.addEventListener('contextmenu', (e) => {
  e.preventDefault()
  menu.popup(remote.getCurrentWindow())
}, false)
</script>

macOS应用程序菜单注意事项

相对于windows 和 linux, macOS 上的应用菜单是完全不同的样式,这里是一些注意事项,来让你的菜单项更原生化.

标准菜单

在macOS上有很多系统定义的标准菜单,例如 Services和 Windows菜单。要使菜单成为标准菜单,您设置菜单的 role 属性,Electron 将会自动识别,可选值有:

  • window

  • help

  • services

标准菜单项操作

macOS为某些菜单项提供了标准操作,例如 关于xxx, 隐藏xxx和 隐藏其他。要将菜单项操作设置为标准操作,你需要设置菜单的 role 属性。

主菜单的名称

在 macOS ,无论你设置的什么标签,应用菜单的第一个菜单项的标签始终未你的应用名字.

设置特定浏览器窗口的菜单 (Linux Windows)

菜单项位置

当通过 Menu.buildFromTemplate 创建菜单的时候,你可以使用 position and id 来放置菜单项. MenuItem 的属性 position 格式为 [placement]=[id], placement 取值为 before, after, 或 endof 三个参数, id 是已存在菜单项的唯一 ID:

  • before - 在指定id菜单项之前插入. 如果指定菜单项不存在,则将其插在菜单末尾.

  • after - 在指定id菜单项之后插入. 如果指定菜单项不存在,则将其插在菜单末尾.

  • endof - 在包含指定id菜单项的分组末尾插入. 如果指定菜单项不存在, 则将用id创建新的分组,并在分组中插入菜单项.

当某个菜单项插入成功后,未插入的其它菜单项会跟随插入.所以,如需在同位置插入一组菜单项,只需将这个组第一个菜单项插入指定位置.

示例

模板1:

[
  {label: '4', id: '4'},
  {label: '5', id: '5'},
  {label: '1', id: '1', position: 'before=4'},
  {label: '2', id: '2'},
  {label: '3', id: '3'}
]

菜单1:

- 1
- 2
- 3
- 4
- 5

模板2:

[
  {label: 'a', position: 'endof=letters'},
  {label: '1', position: 'endof=numbers'},
  {label: 'b', position: 'endof=letters'},
  {label: '2', position: 'endof=numbers'},
  {label: 'c', position: 'endof=letters'},
  {label: '3', position: 'endof=numbers'}
]

菜单2:

- ---
- a
- b
- c
- ---
- 1
- 2
- 3

通常你只需使用 的属性模拟macOS默认的菜单行为.

更多macOS原生action,请参阅

返回 Menu,一般来说, template 只是用来构造 的数组 options .你也可以向 template 元素添加其它东西,使它们该菜单项的属性.

一个包含菜单项的 MenuItem[]数组。每个Menu由多个组成,每个 MenuItem可以有一个子菜单。

Menu类仅在主进程中可用,但您也可以通过模块在渲染过程中使用它。

使用模块在渲染进程中动态创建菜单的示例,当用户右击页面时显示:

想要改变它的话,你必须通过修改应用程序包的 Info.plist 文件来修改应用名字.详见

浏览器窗口的 可以设置某些浏览

macOS Cocoa事件处理指南
MenuItem
MenuItem
remote
remote
关于信息属性列表文件
MenuItem
实例属性
主进程
role
setMenu 方法