如何禁用Electron自定义标题栏中的系统上下文菜单?

iswrvxsc  于 2023-09-28  发布在  Electron
关注(0)|答案(3)|浏览(213)

我使用的是一个带有自定义标题栏的Electron无框窗口,但是当右键单击它时会出现一个上下文菜单。如何禁用显示此菜单?

这是电子版本:

"electron": "^11.3.0",

这是电子启动程序:main.js,但系统上下文菜单不工作后,应用程序启动在这里。

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const url = require('url');

let mainWindow;
function createWindow() {
  mainWindow = new BrowserWindow({
    show: false,
    frame: false,
    useContentSize: true,
    hasShadow: true,
    webPreferences: {
      nodeIntegration: true,
      enableRemoteModule: true,
      contextIsolation: false,
      preload: path.join(__dirname, 'preload.js'),
    },
  });

  mainWindow.loadURL(
    process.env.NODE_ENV === 'development'
      ? 'http://localhost:5000'
      : url.format({
          pathname: path.join(__dirname, '../build/index.html'),
          protocol: 'file:',
          slashes: true,
        })
  );

  if (process.env.NODE_ENV === 'development') {
    mainWindow.webContents.openDevTools();
  }

  mainWindow.on('system-context-menu', (event, _point) => {
    event.preventDefault();
  });
}

const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
  app.quit();
} else {
  app.on('second-instance', (event, commandLine, workingDirectory) => {
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore();
      mainWindow.focus();
    }
  });

  app.whenReady().then(createWindow);

  app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
      app.quit();
    }
  });

  // just work in macOS
  // https://www.electronjs.org/docs/api/app#%E4%BA%8B%E4%BB%B6-activate-macos
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
}
kpbwa7wx

kpbwa7wx1#

在Windows上,您应该能够拦截BrowserWindowsystem-context-menu事件并将其取消。

mainWindow.on("system-context-menu", (event, _point) => {
    event.preventDefault();
});

此行为已添加到this PR中的Electron 11中。

**编辑:**由于this Electron bug的原因,此事件实际上不会在无框窗口中触发。在我的解决方案起作用之前,它需要被修复。我不知道有什么变通的办法。

np8igboo

np8igboo2#

电子仍然没有修复这个错误,我很累,电子有很多错误的窗口。
如果它有效,试试看:

const WM_INITMENU = 0x0116;
  const menu = Menu.buildFromTemplate([]);

  win.hookWindowMessage(WM_INITMENU, () => {
    win.setEnabled(false);
    win.setEnabled(true);
    menu.popup();
  });

https://github.com/electron/electron/issues/24893#issuecomment-1109262719

11dmarpk

11dmarpk3#

基于Jour的答案做下面的代码在我这边是可以的,关键点有两个(0x0116和把buildFormTemplate设为null),当然,同时,你想有自己的右键菜单,可以跟着电子文档去开发,

const WM_INITMENU = 0x0116
 const right_menu = Menu.buildFromTemplate([])
    mainWindow.hookWindowMessage(WM_INITMENU, () => {
    mainWindow.setEnabled(false)
    mainWindow.setEnabled(true)
])

关于自己的菜单

const WM_INITMENU = 0x0116
 const right_menu = Menu.buildFromTemplate([{"label":"About",...,function(){}},{"label":"Exit",...,function(){}}])
        mainWindow.hookWindowMessage(WM_INITMENU, () => {
        mainWindow.setEnabled(false)
        mainWindow.setEnabled(true)
        right_menu.popup()
    ])

相关问题