如何更改电子快速启动示例应用程序的原生菜单

时间:2016-01-17 15:23:52

标签: javascript menu electron

电子应用程序打开时出现在电子快速启动示例应用程序中的相同默认菜单以及如何更改它? 还尝试了menu example on the docs,但没有任何变化。 当我用mainWindow.setMenu(null);隐藏菜单时菜单消失但仍然无法启动新菜单

任何想法?

平台:Windows 7

电子版:0.36.4

ref file:

的package.json:

{
  "name": "electric_timer",
  "version": "0.1.0",
  "description": "a Time sheet & project managment",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "none"
  },
  "author": "Eyal Ron",
  "license": "MIT"
}

app.js:

var app = require('app');
var BrowserWindow = require('browser-window');

app.on('ready', function (){
  var mainWindow = new BrowserWindow({
    width: 800,
    height: 600
  });
  mainWindow.setMenu(null);
  mainWindow.loadUrl('file://' + __dirname + '/main.html');
});

main.js:

var remote = require('remote');
var Menu = remote.require('menu');

var menu = Menu.buildFromTemplate([
  {
    label: 'Electron',
    submenu: [
      {
        label: 'Prefs',
        click: function(){
          alert('hello menu');
        }
      }
    ]
  }
]);
Menu.setApplicationMenu(menu);

main.html中:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>electron test</title>
</head>
<body>
  <h1>hello world</h1>
  <script>requier('./main.js')</script>
</body>
</html>

4 个答案:

答案 0 :(得分:9)

Electron&#39; default_app&#39; sets the menu;如果你想避免这种情况,你需要Electron直接启动你的应用程序,而不是通过默认应用程序(注意:如果你用electron .启动应用程序,你实际上启动了默认应用程序。)

电子looks in its resource folder适用于&#39;应用&#39; app.asar&#39;或者&#39; default_app&#39;,因此,为了直接启动您的应用,您需要将其复制或链接到Electron的资源文件夹中。

无论您如何启动应用程序,都可以使用Menu.setApplicationMenu设置菜单 - 您可以在主过程中执行此操作,您不需要像在示例中那样在Renderer中执行此操作。顺便说一句,你的main.html中有一个拼写错误(requier而不是require),所以如果这是你的实际代码,那么就表明你的main.js根本没有运行。

答案 1 :(得分:2)

将自定义菜单的逻辑放入您的 app('ready')事件回调中。尝试下面的代码示例

const {app, BrowserWindow, Menu} = require('electron');
let mainWindow;
let menuTemplate = [
    {
        label: "Window Manager",
        submenu: [
            { label: "create New" }
        ]
    },
    {
      label : "View",
            submenu : [
        { role : "reload" },
        { label : "custom reload" }
        ]
    }
];
function appInit () {
  // Create the browser window.
  mainWindow = new BrowserWindow({width: 800, height: 600})

  // and load the main.html of the app.
  mainWindow.loadFile('main.html')

    let menu = Menu.buildFromTemplate(menuTemplate);
    Menu.setApplicationMenu(menu);
}
app.on('ready', () => {
  appInit();
})

答案 2 :(得分:0)

您的应用程序中Electron在哪里?您的package.json文件应如下所示:

{
  "name": "todos",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "electron": "electron ."
  },
  "author":
    "Who Cares <email@example.com> (https://doesntmatter.com/)",
  "license": "MIT",
  "dependencies": {
    "electron": "3.0.8"
  }
}

您的电子侧将如下所示:

const electron = require('electron');
const { app, BrowserWindow, Menu } = electron;

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({});
  mainWindow.loadURL(`file://${__dirname}/main.html`);

  const mainMenu = Menu.buildFromTemplate(menuTemplate);
  Menu.setApplicationMenu(mainMenu);
});

const menuTemplate = [
  {
    label: 'File'
  }
];

即使修复了语法,您仍然会遇到接管默认的Electron菜单及其键绑定的问题。您是说要添加自己的自定义菜单和按键绑定,如果这是您的目标,那么可以在生产中添加菜单和按键绑定,但这听起来像您已经失去了要维护的功能。

您可以这样解决它:

const menuTemplate = [
  {
    label: 'File',
    submenu: [{ label: 'New Todo' }]
  }
];

答案 3 :(得分:0)

好像电子Menu和MenuItem对象设置为不可变的。

这意味着如果要修改它们,则必须创建新对象并使用它。这是我的代码为此做的,以隐藏帮助菜单和开发人员工具:

// main.js

function createWindow () {
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

...

  let defaultMenu = Menu.getApplicationMenu()

  let newMenu = new Menu();
  defaultMenu.items
    .filter(x => x.role != 'help')
    .forEach(x => {
      if(x.role == 'viewmenu' && process.env.NODE_ENV == 'production') {
        let newSubmenu = new Menu();

        x.submenu.items.filter(y => y.role != 'toggledevtools').forEach(y => newSubmenu.append(y));

        x.submenu = newSubmenu;

        newMenu.append(
          new MenuItem({
            type: x.type,
            label: x.label,
            submenu: newSubmenu
          })
        );
      } else {
        newMenu.append(x);
      }
    })

  Menu.setApplicationMenu(newMenu);

...
  })
}

app.on('ready', createWindow)