import { app, BrowserWindow, Tray, Menu, globalShortcut, nativeImage, } from "electron"; import { createRequire } from "node:module"; import { fileURLToPath } from "node:url"; import path from "node:path"; import { readdirSync } from "node:fs"; import dicomParser from "dicom-parser"; import registerIpcMainHandlers from "./ipcMainHandlers"; const require = createRequire(import.meta.url); const __dirname = path.dirname(fileURLToPath(import.meta.url)); process.env.APP_ROOT = path.join(__dirname, ".."); export const VITE_DEV_SERVER_URL = process.env["VITE_DEV_SERVER_URL"]; export const MAIN_DIST = path.join(process.env.APP_ROOT, "dist-electron"); export const RENDERER_DIST = path.join(process.env.APP_ROOT, "dist"); process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL ? path.join(process.env.APP_ROOT, "public") : RENDERER_DIST; let win: BrowserWindow | null; let tray: Tray | null = null; function createWindow() { win = new BrowserWindow({ width: 1600, height: 900, icon: path.join(process.env.VITE_PUBLIC, "tray-icon.svg"), // frame: false, titleBarStyle: "hidden", // customButtonsOnHover || hidden || hiddenInset titleBarOverlay: { height: 36, color: "#f8f8f8" }, // 渲染进程发消息动态改变这个 webPreferences: { preload: path.join(__dirname, "preload.mjs") }, }); // Test active push message to Renderer-process. win.webContents.on("did-finish-load", () => { win?.webContents.send("main-process-message", { platform: process.platform === "darwin" ? "macos" : "windows", }); }); if (VITE_DEV_SERVER_URL) { win.loadURL(VITE_DEV_SERVER_URL); } else { win.loadFile(path.join(RENDERER_DIST, "index.html")); } createTray(); registerGlobalShortcuts(); } function createTray() { const iconPath = path.join(process.env.VITE_PUBLIC, "sample.png"); // 使用 PNG 图标 const icon = nativeImage .createFromPath(iconPath) .resize({ width: 20, height: 20 }); tray = new Tray(icon); const contextMenu = Menu.buildFromTemplate([ { label: "Show App", click: function () { if (win) { win.show(); } }, }, { label: "Quit", click: function () { app.quit(); }, }, ]); tray.setToolTip("My Electron App"); tray.setContextMenu(contextMenu); tray.on("click", () => { if (win) { win.isVisible() ? win.hide() : win.show(); } }); } function registerGlobalShortcuts() { // 注册全局快捷键 'CommandOrControl+Shift+S' 来显示应用窗口 globalShortcut.register("Option+N", () => { if (win) { win.isVisible() ? win.hide() : win.show(); } }); } app.on("window-all-closed", () => { if (process.platform !== "darwin") { app.quit(); win = null; } }); app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); app.whenReady().then(() => { createWindow(); registerIpcMainHandlers(); // 设置 Dock 图标 if (process.platform === "darwin") { const dockIconPath = path.join(process.env.VITE_PUBLIC, "tray-icon.png"); const dockIcon = nativeImage.createFromPath(dockIconPath); app.dock.setIcon(dockIcon); } }); // 注销全局快捷键,当应用退出时 app.on("will-quit", () => { globalShortcut.unregisterAll(); });