electron/docs/tutorial/keyboard-shortcuts.md

168 lines
5.7 KiB
Markdown
Raw Normal View History

2017-02-26 02:59:13 +00:00
# Keyboard Shortcuts
## Overview
2017-02-26 02:59:13 +00:00
This feature allows you to configure local and global keyboard shortcuts
for your Electron application.
2017-02-26 02:59:13 +00:00
## Example
### Local Shortcuts
Local keyboard shortcuts are triggered only when the application is focused.
To configure a local keyboard shortcut, you need to specify an [`accelerator`][]
property when creating a [MenuItem][] within the [Menu][] module.
Starting with a working application from the
[Quick Start Guide](quick-start.md), update the `main.js` file with the
following lines:
2017-02-26 02:59:13 +00:00
```javascript fiddle='docs/fiddles/features/keyboard-shortcuts/local'
2018-09-13 16:10:51 +00:00
const { Menu, MenuItem } = require('electron')
2017-02-26 02:59:13 +00:00
const menu = new Menu()
2017-02-26 02:59:13 +00:00
menu.append(new MenuItem({
label: 'Electron',
submenu: [{
role: 'help',
accelerator: process.platform === 'darwin' ? 'Alt+Cmd+I' : 'Alt+Shift+I',
click: () => { console.log('Electron rocks!') }
}]
2017-02-26 02:59:13 +00:00
}))
Menu.setApplicationMenu(menu)
2017-02-26 02:59:13 +00:00
```
> NOTE: In the code above, you can see that the accelerator differs based on the
user's operating system. For MacOS, it is `Alt+Cmd+I`, whereas for Linux and
Windows, it is `Alt+Shift+I`.
2017-02-26 02:59:13 +00:00
After launching the Electron application, you should see the application menu
along with the local shortcut you just defined:
![Menu with a local shortcut](../images/local-shortcut.png)
If you click `Help` or press the defined accelerator and then open the terminal
that you ran your Electron application from, you will see the message that was
generated after triggering the `click` event: "Electron rocks!".
### Global Shortcuts
2017-02-26 02:59:13 +00:00
To configure a global keyboard shortcut, you need to use the [globalShortcut][]
module to detect keyboard events even when the application does not have
keyboard focus.
2017-02-26 03:21:33 +00:00
Starting with a working application from the
[Quick Start Guide](quick-start.md), update the `main.js` file with the
following lines:
2017-02-26 03:21:33 +00:00
```javascript fiddle='docs/fiddles/features/keyboard-shortcuts/global' @ts-type={createWindow:()=>void}
2018-09-13 16:10:51 +00:00
const { app, globalShortcut } = require('electron')
2017-02-26 03:21:33 +00:00
app.whenReady().then(() => {
globalShortcut.register('Alt+CommandOrControl+I', () => {
console.log('Electron loves global shortcuts!')
2017-02-26 03:21:33 +00:00
})
}).then(createWindow)
2017-02-26 03:21:33 +00:00
```
> NOTE: In the code above, the `CommandOrControl` combination uses `Command`
on macOS and `Control` on Windows/Linux.
After launching the Electron application, if you press the defined key
combination then open the terminal that you ran your Electron application from,
you will see that Electron loves global shortcuts!
### Shortcuts within a BrowserWindow
2017-02-26 03:07:09 +00:00
#### Using web APIs
If you want to handle keyboard shortcuts within a [BrowserWindow][], you can
listen for the `keyup` and `keydown` [DOM events][dom-events] inside the
renderer process using the [addEventListener() API][addEventListener-api].
2017-02-26 02:59:13 +00:00
```javascript fiddle='docs/fiddles/features/keyboard-shortcuts/web-apis|focus=renderer.js'
const handleKeyPress = (event) => {
// You can put code here to handle the keypress.
document.getElementById('last-keypress').innerText = event.key
console.log(`You pressed ${event.key}`)
}
window.addEventListener('keyup', handleKeyPress, true)
2017-02-26 02:59:13 +00:00
```
> Note: the third parameter `true` indicates that the listener will always receive
key presses before other listeners so they can't have `stopPropagation()`
called on them.
#### Intercepting events in the main process
2017-02-26 02:59:13 +00:00
The [`before-input-event`](../api/web-contents.md#event-before-input-event) event
is emitted before dispatching `keydown` and `keyup` events in the page. It can
be used to catch and handle custom shortcuts that are not visible in the menu.
Starting with a working application from the
[Quick Start Guide](quick-start.md), update the `main.js` file with the
following lines:
```javascript fiddle='docs/fiddles/features/keyboard-shortcuts/interception-from-main'
const { app, BrowserWindow } = require('electron')
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 800, height: 600 })
win.loadFile('index.html')
win.webContents.on('before-input-event', (event, input) => {
if (input.control && input.key.toLowerCase() === 'i') {
console.log('Pressed Control+I')
event.preventDefault()
}
})
})
```
After launching the Electron application, if you open the terminal that you ran
your Electron application from and press `Ctrl+I` key combination, you will
see that this key combination was successfully intercepted.
#### Using third-party libraries
If you don't want to do manual shortcut parsing, there are libraries that do
advanced key detection, such as [mousetrap][]. Below are examples of usage of the
`mousetrap` running in the Renderer process:
2017-02-26 03:07:09 +00:00
```js @ts-nocheck
2017-02-27 17:34:35 +00:00
Mousetrap.bind('4', () => { console.log('4') })
Mousetrap.bind('?', () => { console.log('show shortcuts!') })
Mousetrap.bind('esc', () => { console.log('escape') }, 'keyup')
2017-02-26 03:07:09 +00:00
// combinations
2017-02-27 17:34:35 +00:00
Mousetrap.bind('command+shift+k', () => { console.log('command shift k') })
2017-02-26 03:07:09 +00:00
// map multiple combinations to the same callback
2017-02-27 17:34:35 +00:00
Mousetrap.bind(['command+k', 'ctrl+k'], () => {
2017-02-26 03:07:09 +00:00
console.log('command k or control k')
2017-02-27 17:34:35 +00:00
// return false to prevent default behavior and stop event from bubbling
2017-02-26 03:07:09 +00:00
return false
})
// gmail style sequences
2017-02-27 17:34:35 +00:00
Mousetrap.bind('g i', () => { console.log('go to inbox') })
Mousetrap.bind('* a', () => { console.log('select all') })
2017-02-26 03:07:09 +00:00
// konami code!
2017-02-27 17:34:35 +00:00
Mousetrap.bind('up up down down left right left right b a enter', () => {
2017-02-26 03:07:09 +00:00
console.log('konami code')
})
```
2017-02-26 02:59:13 +00:00
[Menu]: ../api/menu.md
[MenuItem]: ../api/menu-item.md
[globalShortcut]: ../api/global-shortcut.md
[`accelerator`]: ../api/accelerator.md
[BrowserWindow]: ../api/browser-window.md
2017-02-26 03:07:09 +00:00
[mousetrap]: https://github.com/ccampbell/mousetrap
[dom-events]: https://developer.mozilla.org/en-US/docs/Web/Events
[addEventListener-api]: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener