任务栏自定义

概览

Electron有API来配置Windows任务栏中的应用程序图标。 这个API既支持Windows独有的特性也支持跨平台特性, 比如windows的创建一个 JumpList, 定制开发缩略图和工具条,图标覆盖, 和所谓的“Flash Frame” 效果, 再比如跨平台的 最近打开过的文档程序执行进度条等特性.

弹出列表

Windows 允许应用程序自定义一个菜单栏,当用户右键单击任务栏中的应用图标及可显示该列表。 该上下文菜单被称为 JumpList。 根据 MSDN 叙述,你应该从 JumpList 的 Tasks 分类中指定自定义动作。

应用程序的“任务”列表的制定是基于程序的功能,用户能用它做一些快捷操作。 任务应当是与上下文无关的,因为它不需要程序运行就可以工作。 而且据统计,它们应该是用户在这个应用上使用最多的操作,例如: 撰写一封邮件或者在邮件程序里打开日历,word处理程序新建一个文档,以某一种模式启动应用程序,或者是启动应用程序的某些子命令。 一个应用程序不应当定义一些用户不需要的高级功能的或者只会使用一次的操作的菜单,以防止将菜单弄得杂乱无章,例如注册。 不要将“任务”功能用于广告操作,例如升级应用或者推广特价产品等等。

强烈推荐“任务”列表内容是静态的。 不管什么情形,也不管应用程序是什么状态,它都应该是保持不变的。 尽管这个列表是动态可变的,你应该注意,那些没想过这个列表会变的用户会被这个行为搞糊涂。

任务栏 JumpList

注意: 上面的截图是Microsoft Edge的任务栏示例

MacOS里的docker menu是菜单项,然而windows里的user tasks只是一个快捷方式。 举个栗子,当用户点击task的时候,程序将会执行特定的参数。

你可以使用 app.setUserTasks API 来设置你的应用中的用户任务.

示例

设置用户任务

按照 快速启动指引 启动一个应用, 使用下面的代码更新 main.js 文件:

  1. const { app } = require('electron')
  2. app.setUserTasks([
  3. {
  4. program: process.execPath,
  5. arguments: '--new-window',
  6. iconPath: process.execPath,
  7. iconIndex: 0,
  8. title: 'New Window',
  9. description: 'Create a new window'
  10. }
  11. ])
清空任务列表

要想清除任务列表, 你需要在 main.js 文件内调用 app.setUserTasks 方法, 参数是空数组即可

  1. const { app } = require('electron')
  2. app.setUserTasks([])

注意:即使你的应用关闭,用户任务仍然会被显示,因此在你的应用被卸载之前,任务的图标和程序的路径必须是存在的。

缩略图工具栏

在 Windows,你可以在任务栏上添加一个按钮来当作应用的缩略图工具栏。 它为用户提供了一种访问特定窗口命令的方式, 而无需还原或激活该窗口。

引自 MSDN

此工具栏只是常见的标准工具栏控件。 它最多拥有七个按钮。 每个按钮的 ID、图像、工具提示和状态都定义在结构中, 然后传递给任务栏。 应用程序可以根据其当前状态的要求, 显示、启用、禁用或隐藏缩略图工具栏中的按钮。

例如, Windows 媒体播放机可能提供标准的媒体传输控制, 如播放、暂停、静音和停止。

缩略图工具栏

注:上面的屏幕截图是 Windows 媒体播放器的缩略图工具栏示例

要在应用程序中设置缩略图工具栏,可以使用 BrowserWindow.setThumbarButtons

示例

设置缩略图工具栏

按照 快速启动指引 启动一个应用, 使用下面的代码更新 main.js 文件:

  1. const { BrowserWindow } = require('electron')
  2. const path = require('path')
  3. const win = new BrowserWindow()
  4. win.setThumbarButtons([
  5. {
  6. tooltip: 'button1',
  7. icon: path.join(__dirname, 'button1.png'),
  8. click () { console.log('button1 clicked') }
  9. }, {
  10. tooltip: 'button2',
  11. icon: path.join(__dirname, 'button2.png'),
  12. flags: ['enabled', 'dismissonclick'],
  13. click () { console.log('button2 clicked.') }
  14. }
  15. ])
清除缩略图工具栏

要清除缩略图工具栏按钮,您需要在 main.js 文件调用 BrowserWindow.setThumbaritons 函数设置为空数组。

  1. const { BrowserWindow } = require('electron')
  2. const win = new BrowserWindow()
  3. win.setThumbarButtons([])

任务栏中的图标叠加

在 Windows,任务栏按钮可以使用小型叠加层显示应用程序状态。

引自 MSDN

图标叠加作为状态的上下文通知, 旨在否定需要一个单独的通知区域状态图标来将该信息传达给用户。 例如, 当前在通知区域中显示的 Microsoft Outlook 中的新邮件状态现在可以通过任务栏按钮上的叠加来表示。 同样, 您必须在开发周期中决定哪个方法最适合您的应用程序。 叠加图标用于提供重要的、长期的状态或通知, 如网络状态、messenger 状态或新邮件。 不应向用户显示不断变化的叠加或动画。

任务栏按钮的叠层

注:上面的屏幕截图是任务栏按钮叠加的示例

你可以使用 BrowserWindow.setOverlayIcon API来设置窗口的叠加层图标

示例

按照 快速启动指引 启动一个应用, 使用下面的代码更新 main.js 文件:

  1. const { BrowserWindow } = require('electron')
  2. const win = new BrowserWindow()
  3. win.setOverlayIcon('path/to/overlay.png', 'Description for overlay')

闪烁框

在Windows上,你可以突出显示任务栏按钮以获得用户的关注。 这与在 macOS 上 dock 弹跳图标相似。

引自 MSDN

通常, 会闪现一个窗口, 通知用户该窗口需要注意, 但是该窗口当前没有键盘焦点。

想要刷新 BrowserWindow 任务栏按钮, 你可以使用 BrowserWindow.flashFrame API.

示例

按照 快速启动指引 启动一个应用, 使用下面的代码更新 main.js 文件:

  1. const { BrowserWindow } = require('electron')
  2. const win = new BrowserWindow()
  3. win.once('focus', () => win.flashFrame(false))
  4. win.flashFrame(true)

注意:别忘了调用 win.flashFramework(false) 来关闭闪烁。 在上面的示例中, 当窗口进入焦点时会调用它, 但您可能会使用超时或其他一些事件来禁用它。