electron最小化托盘、禁用右键菜单

备份一下以防止忘记

// 引用 Tray 和 path 
import { BrowserWindow, Menu, app, ipcMain, Tray } from "electron";
const path = require("path");

1、创建窗口

// 创建窗口
let mainWindow = new BrowserWindow({
    minHeight: 0,
    useContentSize: true,
    minHeight: 80,
    width: 450,
    show: false,
    frame: false, // 无边框
    webPreferences: {
      contextIsolation: false,
      nodeIntegration: true,
      webSecurity: false,
      // 如果是开发模式可以使用devTools 调试
      devTools: process.env.NODE_ENV === "development" || config.build.openDevTools,
      // 在macos中启用橡皮动画
      scrollBounce: process.platform === "darwin",
    },
    resizable: true, //禁止窗口大小缩放
    transparent: true, //设置透明
    alwaysOnTop: process.env.NODE_ENV === "production", //窗口是否总是显示在其他窗口之前
  });

 2、最小化托盘

 // 任务栏-关闭所有窗口-的时候触发
  mainWindow.on("close", (event) => {
    mainWindow.hide();
    mainWindow.setSkipTaskbar(true);
    event.preventDefault();
  });

  //终端最小化托盘
  global.__static = path.join(__dirname, "/static").replace(/\\/g, "\\\\");  // 打包后地址指向 dist/static
  let iconPath =
    process.env.NODE_ENV === "development"
      ? path.join(__dirname, "../../../static/icon.ico")
      : path.join(__static, "./icon.ico");
  
  let tray = new Tray(iconPath);
  const contextMenu = Menu.buildFromTemplate([
    {
      label: "退出",
      click: () => {
        mainWindow.destroy();
        app.quit();
      },
    },
  ]);
  tray.setToolTip("终端名称");  
  tray.setContextMenu(contextMenu);
  tray.on("click", () => {   // 点击托盘图标显示窗口
    mainWindow.show();
    mainWindow.setSkipTaskbar(false);
  });

3、 解决 electron 使用win.hide()再使用win.show()会引起窗口闪烁问题

app.commandLine.appendSwitch('wm-window-animations-disabled');

4、禁用右键菜单 


  // 禁用右键菜单
  mainWindow.hookWindowMessage(278, function (e) {
    mainWindow.setEnabled(false); //窗口禁用
    setTimeout(() => {
      mainWindow.setEnabled(true);
    }, 100); //延时太快会立刻启动,太慢会妨碍窗口其他操作,可自行测试最佳时间
    return true;
  });

5、Electron 唤醒(托盘最小化的时候双击桌面快捷键图标唤醒页面)

// electron 托盘最小化的时候双击桌面图标快捷键启动
// window平台 检测 app.requestSingleInstanceLock() 是否是单例模式,如果是就退出,并且发送一个事件给 second-instance 
const gotTheLock = app.requestSingleInstanceLock();
if (gotTheLock) {
  app.on("second-instance", (event, commandLine, workingDirectory) => {
    // 当运行第二个实例时,将会聚焦到mainWindow这个窗口
    if (mainWindow) {
      mainWindow.show();
      mainWindow.setSkipTaskbar(false);
      mainWindow.focus();
    }
  });
}

参考:Electron 生命周期介绍

6、禁止程序多开

//禁止程序多开,此处需要单例锁的打开注释即可
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
  app.quit();
}

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值