我想在电子应用程序中实现绑定到Command+R
键盘快捷方式的自定义操作。
我克隆了electron-quick-start
存储库,并将main.js
文件更改为:
const { app, Menu, MenuItem, BrowserWindow } = require('electron')
let mainWindow
let template = [
{ label: app.getName(), submenu: [
{ label: 'custom action 1', accelerator: 'Command+R', click() { console.log('go!') } },
{ label: 'custom action 2', accelerator: 'Shift+Command+R', click() { console.log('go!') } },
{ type: 'separator' },
{ role: 'quit' }
] }
]
const menu = Menu.buildFromTemplate(template)
function createWindow () {
mainWindow = new BrowserWindow({width: 800, height: 600})
mainWindow.loadURL(`file://${__dirname}/index.html`)
mainWindow.webContents.openDevTools()
mainWindow.on('closed', function () { mainWindow = null })
// Set application menu
Menu.setApplicationMenu(menu)
}
app.on('ready', createWindow)
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})
当应用程序运行npm start
时,菜单可以正常工作,但当你按R键时,页面会重新加载,而不是执行模板中定义的自定义快捷方式。
我错过了什么吗?
6条答案
按热度按时间sqserrrh1#
这里是简单的解决方案::
第一个
c86crjj02#
最好使用类似mousetrap的代码
https://github.com/ccampbell/mousetrap
我在www.example.com https://www.electronjs.org/docs/tutorial/keyboard-shortcuts上找到了此解决方案electronjs.org
涉及globalShortcut的解决方案不是最佳的。使用globalShortcut将对所有内容禁用该快捷方式,而不仅仅是在您的应用程序中。
例如:如果您使用globalShortcut在应用程序中禁用Ctrl+R,然后尝试在浏览器中刷新youtube视频,它将阻止您执行此操作。
编辑:另一个解决方案http://www.openjs.com/scripts/events/keyboard_shortcuts/
hwamh0ep3#
防止浏览器窗口刷新
用户可以按Cmd+R(在macOS上)或Ctrl+R/Ctrl+Shift+R/F5(在Windows上)来刷新浏览器窗口显示的网页。真正的原生应用程序不会出现这种行为。
建议的解决方案是替换默认菜单以禁用此行为。在Windows上,您可以调用win.removeMenu()。在macOS上,您可以调用Menu.setApplicationMenu(Menu.buildFromTemplate([]))。您应该只在生产时这样做,因为您将无法访问DevTools。
对于Kiosk模式,另一个解决方案是在BrowserWindow获得焦点时禁用键盘快捷方式,然后在BrowserWindow失去焦点或关闭/隐藏时取消注册快捷方式。
从https://electron.guide/final-polish/renderer/开始
u1ehiz5o4#
this is the link to official docs for above code snippet.根据开发或生产情况,您可以使用依赖关系动态禁用或启用快捷方式"electron-is-Dev"
zf2sa74q5#
ezykj2lf6#