使用 BrowserWindow.fromWebContents 时如何设置电子菜单的自定义 x、y 位置

How to set custom x, y position of Electron Menu when using BrowserWindow.fromWebContents

我正在使用 contextBridgecontextIsolation 在点击时创建自定义上下文菜单,我正在使用文档中的这个示例:https://github.com/electron/electron/blob/main/docs/api/menu.md#render-process

// renderer
window.addEventListener('contextmenu', (e) => {
  e.preventDefault()
  ipcRenderer.send('show-context-menu')
})

ipcRenderer.on('context-menu-command', (e, command) => {
  // ...
})

// main
ipcMain.on('show-context-menu', (event) => {
  const template = [
    {
      label: 'Menu Item 1',
      click: () => { event.sender.send('context-menu-command', 'menu-item-1') }
    },
    { type: 'separator' },
    { label: 'Menu Item 2', type: 'checkbox', checked: true }
  ]
  const menu = Menu.buildFromTemplate(template)
  menu.popup(BrowserWindow.fromWebContents(event.sender))
})

这有效,但上下文菜单出现在鼠标的正下方。我想提供自定义的 x 和 y。 In the docs for menu.popup,我可以这样设置 xy 属性:

menu.popup({
  window: /* my window object /*,
  x: /* x position */,
  y: /* y position */,
})

但我不知道如何将这些属性添加到我从 BrowserWindow.fromWebContents(event.sender) 返回的对象中。

我尝试了这些选项:

menu.popup({ ...BrowserWindow.fromWebContents(event.sender), x, y } );
// or
const window = BrowserWindow.fromWebContents(event.sender);
menu.popup({ window, x, y });

我收到这个错误

Error processing argument at index 1, conversion failure from 
at EventEmitter.a.popup (node:electron/js2c/browser_init:81:3188)

Electron 似乎不喜欢将 BrowserWindow.fromWebContents(event.sender) 的结果转换为对象。

我也试过这个,但得到同样的错误。

const window = BrowserWindow.fromWebContents(event.sender);
window.x = x;
window.y = y;
menu.popup(window);

感谢您的帮助

问题最终是 xy 变量需要是整数,有时它们是浮点数。在 xy 周围放置 Math.round 解决了问题。这最终奏效了:

const xRound = Math.round(x);
const yRound = Math.round(y);
const window = BrowserWindow.fromWebContents(event.sender);
menu.popup({ window, x: xRound, y: yRound } );