Keyboard Shortcuts键盘快捷键
Overview概述
This feature allows you to configure local and global keyboard shortcuts for your Electron application.此功能允许您为Electron应用程序配置本地和全局键盘快捷键。
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.要配置本地键盘快捷键,需要在Menu模块中创建MenuItem时指定加速器属性。
Starting with a working application from the Quick Start Guide, update the 从快速入门指南中的工作应用程序开始,使用以下行更新main.js
file with the following lines:main.js
文件:
- main.js
- index.html
const { app, BrowserWindow, Menu, MenuItem } = require('electron')
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
})
win.loadFile('index.html')
}
const menu = new Menu()
menu.append(new MenuItem({
label: 'Electron',
submenu: [{
role: 'help',
accelerator: process.platform === 'darwin' ? 'Alt+Cmd+I' : 'Alt+Shift+I',
click: () => { console.log('Electron rocks!') }
}]
}))
Menu.setApplicationMenu(menu)
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
})
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<h1>Hello World!</h1>
<p>Hit Alt+Shift+I on Windows, or Opt+Cmd+I on mac to see a message printed to the console.</p>
</body>
</html>
NOTE: In the code above, you can see that the accelerator differs based on the user's operating system.注意:在上面的代码中,您可以看到加速器根据用户的操作系统而有所不同。For MacOS, it is对于MacOS,它是Alt+Cmd+I,而对于Linux和Windows,它是Alt+Shift+I。Alt+Cmd+I
, whereas for Linux and Windows, it isAlt+Shift+I
.
After launching the Electron application, you should see the application menu along with the local shortcut you just defined:启动Electron应用程序后,您应该看到应用程序菜单以及刚刚定义的本地快捷方式:
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!".Help
或按下定义的加速器,然后打开运行Electron应用程序的终端,您将看到触发click
事件后生成的消息:“Electron rocks!”。
Global Shortcuts全球快捷键
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.要配置全局键盘快捷键,您需要使用globalShortcut模块来检测键盘事件,即使应用程序没有键盘焦点。
Starting with a working application from the Quick Start Guide, update the 从快速入门指南中的工作应用程序开始,使用以下行更新mainjs文件:main.js
file with the following lines:
- main.js
- index.html
const { app, BrowserWindow, globalShortcut } = require('electron')
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
})
win.loadFile('index.html')
}
app.whenReady().then(() => {
globalShortcut.register('Alt+CommandOrControl+I', () => {
console.log('Electron loves global shortcuts!')
})
}).then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
})
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<h1>Hello World!</h1>
<p>Hit Alt+Ctrl+I on Windows or Opt+Cmd+I on Mac to see a message printed to the console.</p>
</body>
</html>
NOTE: In the code above, the注意:在上面的代码中,CommandOrControl
combination usesCommand
on macOS andControl
on Windows/Linux.CommandOrControl
组合使用macOS上的Command和Windows/Linux上的Control。
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!启动Electron应用程序后,如果您按下定义的组合键,然后打开运行Electron应用程序的终端,您将看到Electron喜欢全局快捷方式!
Shortcuts within a BrowserWindowBrowserWindow中的快捷键
Using web APIs使用web API
If you want to handle keyboard shortcuts within a BrowserWindow, you can listen for the 如果要在BrowserWindow中处理键盘快捷键,可以使用keyup
and keydown
DOM events inside the renderer process using the addEventListener() API.addEventListener()
API在渲染器进程中侦听keyup
和keydown
DOM事件。
- main.js
- index.html
- renderer.js
// Modules to control application life and create native browser window
const {app, BrowserWindow} = require('electron')
const path = require('path')
function createWindow () {
// Create the browser window.
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
})
// and load the index.html of the app.
mainWindow.loadFile('index.html')
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
createWindow()
app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- http://mdn.asprain.cn/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<p>Hit any key with this window focused to see it captured here.</p>
<div><span>Last Key Pressed: </span><span id="last-keypress"></span></div>
<script src="./renderer.js"></script>
</body>
</html>
function 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)
Note: the third parameter注意:第三个参数true
indicates that the listener will always receive key presses before other listeners so they can't havestopPropagation()
called on them.true
表示监听器将始终在其他监听器之前接收按键,因此不能对其调用stopPropagation()
。
Intercepting events in the main process拦截主进程中的事件
The before-input-event event is emitted before dispatching before-input-event事件是在页面中调度keydown
and keyup
events in the page. keydown
和keyup
事件之前发出的。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, update the 从快速入门指南中的工作应用程序开始,使用以下行更新main.js
file with the following lines:main.js
文件:
- main.js
- index.html
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()
}
})
})
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body>
<h1>Hello World!</h1>
<p>Hit Ctrl+I to see a message printed to the console.</p>
</body>
</html>
After launching the Electron application, if you open the terminal that you ran your Electron application from and press 启动Electron应用程序后,如果打开运行Electron应用程序的终端并按Ctrl+I组合键,您将看到该组合键被成功拦截。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. 如果不想进行手动快捷方式解析,可以使用一些库进行高级键检测,如mousetrap。Below are examples of usage of the 以下是在渲染器进程中运行的mousetrap
running in the Renderer process:mousetrap
的使用示例:
Mousetrap.bind('4', () => { console.log('4') })
Mousetrap.bind('?', () => { console.log('show shortcuts!') })
Mousetrap.bind('esc', () => { console.log('escape') }, 'keyup')
// combinations
Mousetrap.bind('command+shift+k', () => { console.log('command shift k') })
// map multiple combinations to the same callback
Mousetrap.bind(['command+k', 'ctrl+k'], () => {
console.log('command k or control k')
// return false to prevent default behavior and stop event from bubbling
return false
})
// gmail style sequences
Mousetrap.bind('g i', () => { console.log('go to inbox') })
Mousetrap.bind('* a', () => { console.log('select all') })
// konami code!
Mousetrap.bind('up up down down left right left right b a enter', () => {
console.log('konami code')
})