From d4828b1a0ae79fa5cc0d84fd26ee04823a67bc58 Mon Sep 17 00:00:00 2001 From: 2977094657 <2977094657@qq.com> Date: Sun, 18 Jan 2026 14:43:43 +0800 Subject: [PATCH] feat(desktop): close-to-tray setting --- desktop/src/icon.ico | Bin 0 -> 285478 bytes desktop/src/main.cjs | 206 +++++++++++++++++++++++++++ desktop/src/preload.cjs | 3 + frontend/pages/chat/[[username]].vue | 61 ++++++++ 4 files changed, 270 insertions(+) create mode 100644 desktop/src/icon.ico diff --git a/desktop/src/icon.ico b/desktop/src/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9bc5880b6f6859dd2e247e425f2e7c8b6ce0adea GIT binary patch literal 285478 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 literal 0 HcmV?d00001 diff --git a/desktop/src/main.cjs b/desktop/src/main.cjs index 753601e..a2321bc 100644 --- a/desktop/src/main.cjs +++ b/desktop/src/main.cjs @@ -2,6 +2,7 @@ const { app, BrowserWindow, Menu, + Tray, ipcMain, globalShortcut, dialog, @@ -19,6 +20,10 @@ const BACKEND_HEALTH_URL = `http://${BACKEND_HOST}:${BACKEND_PORT}/api/health`; let backendProc = null; let backendStdioStream = null; let resolvedDataDir = null; +let mainWindow = null; +let tray = null; +let isQuitting = false; +let desktopSettings = null; function nowIso() { return new Date().toISOString(); @@ -109,6 +114,163 @@ function logMain(line) { } catch {} } +function getDesktopSettingsPath() { + const dir = getUserDataDir(); + if (!dir) return null; + return path.join(dir, "desktop-settings.json"); +} + +function loadDesktopSettings() { + if (desktopSettings) return desktopSettings; + + const defaults = { + // 'tray' (default): closing the window hides it to the system tray. + // 'exit': closing the window quits the app. + closeBehavior: "tray", + }; + + const p = getDesktopSettingsPath(); + if (!p) { + desktopSettings = { ...defaults }; + return desktopSettings; + } + + try { + if (!fs.existsSync(p)) { + desktopSettings = { ...defaults }; + return desktopSettings; + } + const raw = fs.readFileSync(p, { encoding: "utf8" }); + const parsed = JSON.parse(raw || "{}"); + desktopSettings = { ...defaults, ...(parsed && typeof parsed === "object" ? parsed : {}) }; + } catch (err) { + desktopSettings = { ...defaults }; + logMain(`[main] failed to load settings: ${err?.message || err}`); + } + + return desktopSettings; +} + +function persistDesktopSettings() { + const p = getDesktopSettingsPath(); + if (!p) return; + if (!desktopSettings) return; + + try { + fs.mkdirSync(path.dirname(p), { recursive: true }); + fs.writeFileSync(p, JSON.stringify(desktopSettings, null, 2), { encoding: "utf8" }); + } catch (err) { + logMain(`[main] failed to persist settings: ${err?.message || err}`); + } +} + +function getCloseBehavior() { + const v = String(loadDesktopSettings()?.closeBehavior || "").trim().toLowerCase(); + return v === "exit" ? "exit" : "tray"; +} + +function setCloseBehavior(next) { + const v = String(next || "").trim().toLowerCase(); + loadDesktopSettings(); + desktopSettings.closeBehavior = v === "exit" ? "exit" : "tray"; + persistDesktopSettings(); + return desktopSettings.closeBehavior; +} + +function getTrayIconPath() { + // Prefer an icon shipped in `src/` so it works both in dev and packaged (asar) builds. + const shipped = path.join(__dirname, "icon.ico"); + try { + if (fs.existsSync(shipped)) return shipped; + } catch {} + + // Dev fallback (not available in packaged builds). + const dev = path.resolve(__dirname, "..", "build", "icon.ico"); + try { + if (fs.existsSync(dev)) return dev; + } catch {} + + return null; +} + +function showMainWindow() { + if (!mainWindow) return; + try { + mainWindow.setSkipTaskbar(false); + } catch {} + try { + if (mainWindow.isMinimized()) mainWindow.restore(); + } catch {} + try { + mainWindow.show(); + } catch {} + try { + mainWindow.focus(); + } catch {} +} + +function createTray() { + if (tray) return tray; + if (!app.isPackaged) return null; + + const iconPath = getTrayIconPath(); + if (!iconPath) { + logMain("[main] tray icon not found; disabling tray behavior"); + return null; + } + + try { + tray = new Tray(iconPath); + } catch (err) { + tray = null; + logMain(`[main] failed to create tray: ${err?.message || err}`); + return null; + } + + try { + tray.setToolTip("WeChatDataAnalysis"); + } catch {} + + try { + tray.setContextMenu( + Menu.buildFromTemplate([ + { + label: "显示", + click: () => showMainWindow(), + }, + { + label: "退出", + click: () => { + isQuitting = true; + app.quit(); + }, + }, + ]) + ); + } catch {} + + try { + tray.on("click", () => showMainWindow()); + tray.on("double-click", () => showMainWindow()); + } catch {} + + return tray; +} + +function destroyTray() { + if (!tray) return; + try { + tray.destroy(); + } catch {} + tray = null; +} + +function ensureTrayForCloseBehavior() { + const behavior = getCloseBehavior(); + if (behavior === "tray") createTray(); + else destroyTray(); +} + function getBackendStdioLogPath(dataDir) { return path.join(dataDir, "backend-stdio.log"); } @@ -335,6 +497,26 @@ function createMainWindow() { }, }); + win.on("close", (event) => { + // In packaged builds, we default to "close -> minimize to tray" unless the user opts out. + if (!app.isPackaged) return; + if (isQuitting) return; + if (getCloseBehavior() !== "tray") return; + if (!tray) return; + + try { + event.preventDefault(); + win.setSkipTaskbar(true); + win.hide(); + try { + tray.displayBalloon({ + title: "WeChatDataAnalysis", + content: "已最小化到托盘,可从托盘图标再次打开。", + }); + } catch {} + } catch {} + }); + win.on("closed", () => { stopBackend(); }); @@ -409,6 +591,26 @@ function registerWindowIpc() { return on; } }); + + ipcMain.handle("app:getCloseBehavior", () => { + try { + return getCloseBehavior(); + } catch (err) { + logMain(`[main] getCloseBehavior failed: ${err?.message || err}`); + return "tray"; + } + }); + + ipcMain.handle("app:setCloseBehavior", (_event, behavior) => { + try { + const next = setCloseBehavior(behavior); + ensureTrayForCloseBehavior(); + return next; + } catch (err) { + logMain(`[main] setCloseBehavior failed: ${err?.message || err}`); + return getCloseBehavior(); + } + }); } async function main() { @@ -428,6 +630,8 @@ async function main() { await waitForBackend({ timeoutMs: 30_000 }); const win = createMainWindow(); + mainWindow = win; + ensureTrayForCloseBehavior(); const startUrl = process.env.ELECTRON_START_URL || @@ -455,6 +659,8 @@ app.on("will-quit", () => { }); app.on("before-quit", () => { + isQuitting = true; + destroyTray(); stopBackend(); }); diff --git a/desktop/src/preload.cjs b/desktop/src/preload.cjs index 39681c4..1f1eea2 100644 --- a/desktop/src/preload.cjs +++ b/desktop/src/preload.cjs @@ -8,4 +8,7 @@ contextBridge.exposeInMainWorld("wechatDesktop", { getAutoLaunch: () => ipcRenderer.invoke("app:getAutoLaunch"), setAutoLaunch: (enabled) => ipcRenderer.invoke("app:setAutoLaunch", !!enabled), + + getCloseBehavior: () => ipcRenderer.invoke("app:getCloseBehavior"), + setCloseBehavior: (behavior) => ipcRenderer.invoke("app:setCloseBehavior", String(behavior || "")), }); diff --git a/frontend/pages/chat/[[username]].vue b/frontend/pages/chat/[[username]].vue index 07ada82..22e7755 100644 --- a/frontend/pages/chat/[[username]].vue +++ b/frontend/pages/chat/[[username]].vue @@ -1600,6 +1600,25 @@ {{ desktopAutoLaunchError }} +
+
+
关闭窗口行为
+
点击关闭按钮时:默认最小化到托盘
+
+ +
+
+ {{ desktopCloseBehaviorError }} +
+
启动后自动开启实时获取
@@ -1717,6 +1736,10 @@ const desktopAutoLaunch = ref(false) const desktopAutoLaunchLoading = ref(false) const desktopAutoLaunchError = ref('') +const desktopCloseBehavior = ref('tray') // tray | exit +const desktopCloseBehaviorLoading = ref(false) +const desktopCloseBehaviorError = ref('') + const readLocalBool = (key) => { if (!process.client) return false try { @@ -1768,9 +1791,42 @@ const setDesktopAutoLaunch = async (enabled) => { } } +const refreshDesktopCloseBehavior = async () => { + if (!process.client || typeof window === 'undefined') return + if (!window.wechatDesktop?.getCloseBehavior) return + desktopCloseBehaviorLoading.value = true + desktopCloseBehaviorError.value = '' + try { + const v = await window.wechatDesktop.getCloseBehavior() + desktopCloseBehavior.value = (String(v || '').toLowerCase() === 'exit') ? 'exit' : 'tray' + } catch (e) { + desktopCloseBehaviorError.value = e?.message || '读取关闭窗口行为失败' + } finally { + desktopCloseBehaviorLoading.value = false + } +} + +const setDesktopCloseBehavior = async (behavior) => { + if (!process.client || typeof window === 'undefined') return + if (!window.wechatDesktop?.setCloseBehavior) return + const desired = (String(behavior || '').toLowerCase() === 'exit') ? 'exit' : 'tray' + desktopCloseBehaviorLoading.value = true + desktopCloseBehaviorError.value = '' + try { + const v = await window.wechatDesktop.setCloseBehavior(desired) + desktopCloseBehavior.value = (String(v || '').toLowerCase() === 'exit') ? 'exit' : 'tray' + } catch (e) { + desktopCloseBehaviorError.value = e?.message || '设置关闭窗口行为失败' + await refreshDesktopCloseBehavior() + } finally { + desktopCloseBehaviorLoading.value = false + } +} + const openDesktopSettings = async () => { desktopSettingsOpen.value = true await refreshDesktopAutoLaunch() + await refreshDesktopCloseBehavior() } const closeDesktopSettings = () => { @@ -1782,6 +1838,11 @@ const onDesktopAutoLaunchToggle = async (ev) => { await setDesktopAutoLaunch(checked) } +const onDesktopCloseBehaviorChange = async (ev) => { + const v = String(ev?.target?.value || '').trim() + await setDesktopCloseBehavior(v) +} + const onDesktopAutoRealtimeToggle = async (ev) => { const checked = !!ev?.target?.checked desktopAutoRealtime.value = checked