Учебник по Electron.js

Контекстное меню

Управлять отображением контекстного меню позволяют следующие методы из класса Menu:

Контекстное меню поддерживает следующие события:

Давайте создадим программу, позволяющую отображать контекстное меню и обрабатывать выбор пунктов из меню. Содержимое основного файла приложения main.js приведено в листинге 5.1, файла index.htm — в листинге 5.2, а файла test.js — в листинге 5.3.

Листинг 5.1. Содержимое файла C:\book\e1\main.js

const { app, BrowserWindow, ipcMain, Menu } = require('electron');
let win = null;
function createWindow() {
   win = new BrowserWindow({
      width: 800,
      height: 500,
      webPreferences: {
         nodeIntegration: true,
         contextIsolation: false
      }
   });
   win.webContents.loadFile('index.html');
   win.webContents.openDevTools();
   win.on('closed', () => {
      win = null;
   });
}
app.whenReady().then( () => {
   createWindow();
   app.on('activate', () => {
      if (BrowserWindow.getAllWindows().length === 0) {
         createWindow();
      }
   });
} );
app.on('window-all-closed', () => {
   if (process.platform !== 'darwin') {
      app.quit();
   }
});
ipcMain.on('event-context-menu', (e) => {
   let templateMenu = [
      {
         label: 'Item 1',
         click: () => {
            e.sender.send('event-context-menu-click', 'Item 1');
         }
      },
      {
         label: 'Item 2',
         click: () => {
            e.sender.send('event-context-menu-click', 'Item 2');
         }
      }
   ];
   const menu = Menu.buildFromTemplate(templateMenu);
   menu.on('menu-will-show', () => {
      console.log('menu-will-show');
   });
   menu.on('menu-will-close', () => {
      console.log('menu-will-close');
   });
   menu.popup({
      callback: function() {
         console.log('close popup');
      }
   });
});

Листинг 5.2. Содержимое файла C:\book\e1\index.html

<!doctype html>
<html lang="ru">
<head>
   <meta charset="utf-8">
   <meta http-equiv="Content-Security-Policy"
         content="default-src 'self'">
   <title>Контекстное меню</title>
</head>
<body>
   <h1>Контекстное меню</h1>
   <script src="test.js"></script>
</body>
</html>

Листинг 5.3. Содержимое файла C:\book\e1\test.js

const { ipcRenderer } = require('electron');
window.addEventListener('contextmenu', (e) => {
   e.preventDefault();
   ipcRenderer.send('event-context-menu');
});
ipcRenderer.on('event-context-menu-click', (e, item) => {
   console.log(item);
});