185 lines
		
	
	
	
		
			6.6 KiB
			
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
	
		
			6.6 KiB
			
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Windows Taskbar
 | 
						|
 | 
						|
Electron has APIs to configure the app's icon in the Windows taskbar. Supported
 | 
						|
are the [creation of a `JumpList`](#jumplist),
 | 
						|
[custom thumbnails and toolbars](#thumbnail-toolbars),
 | 
						|
[icon overlays](#icon-overlays-in-taskbar-windows), and the so-called
 | 
						|
["Flash Frame" effect](#flash-frame), but
 | 
						|
Electron also uses the app's dock icon to implement cross-platform features
 | 
						|
like [recent documents][recent-documents] and
 | 
						|
[application progress][progress-bar].
 | 
						|
 | 
						|
## JumpList
 | 
						|
 | 
						|
Windows allows apps to define a custom context menu that shows up when users
 | 
						|
right-click the app's icon in the task bar. That context menu is called
 | 
						|
`JumpList`. You specify custom actions in the `Tasks` category of JumpList,
 | 
						|
as quoted from MSDN:
 | 
						|
 | 
						|
> Applications define tasks based on both the program's features and the key
 | 
						|
> things a user is expected to do with them. Tasks should be context-free, in
 | 
						|
> that the application does not need to be running for them to work. They
 | 
						|
> should also be the statistically most common actions that a normal user would
 | 
						|
> perform in an application, such as compose an email message or open the
 | 
						|
> calendar in a mail program, create a new document in a word processor, launch
 | 
						|
> an application in a certain mode, or launch one of its subcommands. An
 | 
						|
> application should not clutter the menu with advanced features that standard
 | 
						|
> users won't need or one-time actions such as registration. Do not use tasks
 | 
						|
> for promotional items such as upgrades or special offers.
 | 
						|
>
 | 
						|
> It is strongly recommended that the task list be static. It should remain the
 | 
						|
> same regardless of the state or status of the application. While it is
 | 
						|
> possible to vary the list dynamically, you should consider that this could
 | 
						|
> confuse the user who does not expect that portion of the destination list to
 | 
						|
> change.
 | 
						|
 | 
						|
__Tasks of Internet Explorer:__
 | 
						|
 | 
						|

 | 
						|
 | 
						|
Unlike the dock menu in macOS which is a real menu, user tasks in Windows work
 | 
						|
like application shortcuts such that when user clicks a task, a program will be
 | 
						|
executed with specified arguments.
 | 
						|
 | 
						|
To set user tasks for your application, you can use
 | 
						|
[app.setUserTasks][setusertaskstasks] API:
 | 
						|
 | 
						|
```javascript
 | 
						|
const { app } = require('electron')
 | 
						|
app.setUserTasks([
 | 
						|
  {
 | 
						|
    program: process.execPath,
 | 
						|
    arguments: '--new-window',
 | 
						|
    iconPath: process.execPath,
 | 
						|
    iconIndex: 0,
 | 
						|
    title: 'New Window',
 | 
						|
    description: 'Create a new window'
 | 
						|
  }
 | 
						|
])
 | 
						|
```
 | 
						|
 | 
						|
To clean your tasks list, just call `app.setUserTasks` with an empty array:
 | 
						|
 | 
						|
```javascript
 | 
						|
const { app } = require('electron')
 | 
						|
app.setUserTasks([])
 | 
						|
```
 | 
						|
 | 
						|
The user tasks will still show even after your application closes, so the icon
 | 
						|
and program path specified for a task should exist until your application is
 | 
						|
uninstalled.
 | 
						|
 | 
						|
 | 
						|
## Thumbnail Toolbars
 | 
						|
 | 
						|
On Windows you can add a thumbnail toolbar with specified buttons in a taskbar
 | 
						|
layout of an application window. It provides users a way to access to a
 | 
						|
particular window's command without restoring or activating the window.
 | 
						|
 | 
						|
From MSDN, it's illustrated:
 | 
						|
 | 
						|
> This toolbar is simply the familiar standard toolbar common control. It has a
 | 
						|
> maximum of seven buttons. Each button's ID, image, tooltip, and state are defined
 | 
						|
> in a structure, which is then passed to the taskbar. The application can show,
 | 
						|
> enable, disable, or hide buttons from the thumbnail toolbar as required by its
 | 
						|
> current state.
 | 
						|
>
 | 
						|
> For example, Windows Media Player might offer standard media transport controls
 | 
						|
> such as play, pause, mute, and stop.
 | 
						|
 | 
						|
__Thumbnail toolbar of Windows Media Player:__
 | 
						|
 | 
						|

 | 
						|
 | 
						|
You can use [BrowserWindow.setThumbarButtons][setthumbarbuttons] to set
 | 
						|
thumbnail toolbar in your application:
 | 
						|
 | 
						|
```javascript
 | 
						|
const { BrowserWindow } = require('electron')
 | 
						|
const path = require('path')
 | 
						|
 | 
						|
const win = new BrowserWindow()
 | 
						|
 | 
						|
win.setThumbarButtons([
 | 
						|
  {
 | 
						|
    tooltip: 'button1',
 | 
						|
    icon: path.join(__dirname, 'button1.png'),
 | 
						|
    click () { console.log('button1 clicked') }
 | 
						|
  }, {
 | 
						|
    tooltip: 'button2',
 | 
						|
    icon: path.join(__dirname, 'button2.png'),
 | 
						|
    flags: ['enabled', 'dismissonclick'],
 | 
						|
    click () { console.log('button2 clicked.') }
 | 
						|
  }
 | 
						|
])
 | 
						|
```
 | 
						|
 | 
						|
To clean thumbnail toolbar buttons, just call `BrowserWindow.setThumbarButtons`
 | 
						|
with an empty array:
 | 
						|
 | 
						|
```javascript
 | 
						|
const { BrowserWindow } = require('electron')
 | 
						|
 | 
						|
const win = new BrowserWindow()
 | 
						|
win.setThumbarButtons([])
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
## Icon Overlays in Taskbar
 | 
						|
 | 
						|
On Windows a taskbar button can use a small overlay to display application
 | 
						|
status, as quoted from MSDN:
 | 
						|
 | 
						|
> Icon overlays serve as a contextual notification of status, and are intended
 | 
						|
> to negate the need for a separate notification area status icon to communicate
 | 
						|
> that information to the user. For instance, the new mail status in Microsoft
 | 
						|
> Outlook, currently shown in the notification area, can now be indicated
 | 
						|
> through an overlay on the taskbar button. Again, you must decide during your
 | 
						|
> development cycle which method is best for your application. Overlay icons are
 | 
						|
> intended to supply important, long-standing status or notifications such as
 | 
						|
> network status, messenger status, or new mail. The user should not be
 | 
						|
> presented with constantly changing overlays or animations.
 | 
						|
 | 
						|
__Overlay on taskbar button:__
 | 
						|
 | 
						|

 | 
						|
 | 
						|
To set the overlay icon for a window, you can use the
 | 
						|
[BrowserWindow.setOverlayIcon][setoverlayicon] API:
 | 
						|
 | 
						|
```javascript
 | 
						|
const {BrowserWindow} = require('electron')
 | 
						|
let win = new BrowserWindow()
 | 
						|
win.setOverlayIcon('path/to/overlay.png', 'Description for overlay')
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
## Flash Frame
 | 
						|
 | 
						|
On Windows you can highlight the taskbar button to get the user's attention.
 | 
						|
This is similar to bouncing the dock icon on macOS.
 | 
						|
From the MSDN reference documentation:
 | 
						|
 | 
						|
> Typically, a window is flashed to inform the user that the window requires
 | 
						|
> attention but that it does not currently have the keyboard focus.
 | 
						|
 | 
						|
To flash the BrowserWindow taskbar button, you can use the
 | 
						|
[BrowserWindow.flashFrame][flashframe] API:
 | 
						|
 | 
						|
```javascript
 | 
						|
const {BrowserWindow} = require('electron')
 | 
						|
let win = new BrowserWindow()
 | 
						|
win.once('focus', () => win.flashFrame(false))
 | 
						|
win.flashFrame(true)
 | 
						|
```
 | 
						|
 | 
						|
Don't forget to call the `flashFrame` method with `false` to turn off the flash. In
 | 
						|
the above example, it is called when the window comes into focus, but you might
 | 
						|
use a timeout or some other event to disable it.
 | 
						|
 | 
						|
[setthumbarbuttons]: ../api/browser-window.md#winsetthumbarbuttonsbuttons-windows
 | 
						|
[setusertaskstasks]: ../api/app.md#appsetusertaskstasks-windows
 | 
						|
[setoverlayicon]: ../api/browser-window.md#winsetoverlayiconoverlay-description-windows
 | 
						|
[flashframe]: ../api/browser-window.md#winflashframeflag
 | 
						|
[recent-documents]: ./recent-documents.md
 | 
						|
[progress-bar]: ./progress-bar.md
 |