电子使用加速器调用上下文菜单中的菜单项

时间:2015-07-26 12:43:52

标签: javascript contextmenu electron

如何使用menu item在上下文菜单中调用var menu = new Menu(); menu.append(new MenuItem({ label: 'Say something', click: function(){ alert("Hello"); }, accelerator: "CmdOrCtrl+E" })); window.addEventListener('contextmenu', function (e) { e.preventDefault(); menu.popup(currentWindow); }, false);

click event

以上代码有效。将出现上下文菜单,单击菜单项时,单击回调将起作用。

但加速器命令不起作用。有什么想法吗?

附带问题:

我可以将menu.popup传递给menu-item,然后将其传递给click callback h3吗?现在我只是将click事件存储在一个全局变量中。

3 个答案:

答案 0 :(得分:1)

我不相信Electron会注册加速器,除非你拨打Menu.setApplicationMenu(menu)或同等号码。在你的代码片段中,你创建了一个菜单,但在调用popup方法之前,你并没有真正做任何事情。在您注册之前,Electon如何知道您想使用加速器?这些在设置为应用程序菜单时会被注册。

话虽如此,它看起来并不像Electron提供了一种简单的方法来注册本地,渲染器进程的快捷方式,而无需创建BrowserWindow菜单。你可以在这个问题上阅读更多相关内容:https://github.com/atom/electron/issues/1334在OSX中,加速器由操作系统的菜单系统而非Electron处理,因此在没有菜单的情况下为这些本地化快捷方式添加跨平台支持需要大量工作到OSX版本。

建议的解决方案是在JavaScript中捕获所需的快捷方式,然后以这种方式触发命令。您仍然可以使用加速器选项在上下文菜单中表示组合键。

答案 1 :(得分:0)

最好改用它:

const {Menu} = require('electron').Menu;
const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
Menu.setApplicationMenu(mainMenu)

因此您可以使用

mainMenuTemplate.push({
    /* your menu item properties*/
});`

将其推到底。使用unshift()而不是push()将其添加到mainMenuTemplate的开头,但是即使添加了加速器,它们也可以按预期工作。

答案 2 :(得分:0)

我发现今天注册上下文菜单加速器的更简单方法是将上下文菜单附加到您的应用程序菜单,该菜单将进行注册,但是设置visible: false使其实际上不会出现。

使用菜单模板非常简单。

function registerAppMenu(app, invisibleMenus) {
  const template = [ ... ]; // use app to create the file-menu
  template.push(...invisibleMenus.map(menu => ({...menu, visible: false})));
  Menu.setApplicationMenu(Menu.buildFromTemplate(template));
}