electron 禁用通过键盘快捷方式重新加载电子应用程序

oipij1gg  于 2022-12-08  发布在  Electron
关注(0)|答案(6)|浏览(467)

我想在电子应用程序中实现绑定到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键时,页面会重新加载,而不是执行模板中定义的自定义快捷方式。
我错过了什么吗?

sqserrrh

sqserrrh1#

这里是简单的解决方案::
第一个

c86crjj0

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/

hwamh0ep

hwamh0ep3#

防止浏览器窗口刷新

用户可以按Cmd+R(在macOS上)或Ctrl+R/Ctrl+Shift+R/F5(在Windows上)来刷新浏览器窗口显示的网页。真正的原生应用程序不会出现这种行为。
建议的解决方案是替换默认菜单以禁用此行为。在Windows上,您可以调用win.removeMenu()。在macOS上,您可以调用Menu.setApplicationMenu(Menu.buildFromTemplate([]))。您应该只在生产时这样做,因为您将无法访问DevTools。
对于Kiosk模式,另一个解决方案是在BrowserWindow获得焦点时禁用键盘快捷方式,然后在BrowserWindow失去焦点或关闭/隐藏时取消注册快捷方式。

const electronLocalshortcut = require('electron-localshortcut')

win.on('focus', (event) => {
    electronLocalshortcut.register(win, ['CommandOrControl+R','CommandOrControl+Shift+R', 'F5'], () => {})
})

win.on('blur', (event) => {
    electronLocalshortcut.unregisterAll(win)
})

https://electron.guide/final-polish/renderer/开始

u1ehiz5o

u1ehiz5o4#

!isDev &&
app.whenReady().then(() => {
  globalShortcut.register("CommandOrControl+R", () => {
    console.log("CommandOrControl+R is pressed: Shortcut Disabled");
  });
});

this is the link to official docs for above code snippet.根据开发或生产情况,您可以使用依赖关系动态禁用或启用快捷方式"electron-is-Dev"

zf2sa74q

zf2sa74q5#

// main.js
const { Menu, MenuItem } = require('electron')

const menu = new Menu()
menu.append(new MenuItem({
  label: '',
  submenu: [{
    accelerator: 'CommandOrControl+R',
    click: () => { }
  }]
}))

Menu.setApplicationMenu(menu)
ezykj2lf

ezykj2lf6#

app.whenReady().then(() => {

  const mainWindow = new BrowserWindow({
    // width: 800,
    // height: 800,
    resizable: false,
    frame: false,
    webPreferences: {
      preload: path.join(__dirname,'preloader.js'),
    },
   
  }
})

mainWindow.webContents.on('before-input-event', (event, input) => {
  if (input.control && input.key.toLowerCase() === 'r') {
    event.preventDefault()
  }
})

mainWindow.loadURL(path.join(__dirname, 'index.html'))

})

相关问题