备份一下以防止忘记
// 引用 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();
}
});
}
6、禁止程序多开
//禁止程序多开,此处需要单例锁的打开注释即可
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
app.quit();
}