'use strict' const fs = require('fs') const path = require('path') const { app, nativeImage } = require('electron') // 托盘图标:优先用部署包里的 scoreboard.png(换图标不用重新打包), // 找不到时回落到内嵌 base64,保证任何情况下托盘都有图标。 const ICON_PNG_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABUklEQVR42u2XwUdEURTG5z9JSholJY2SklJSf0+0iKFFtIhoES0iWkSLiBaRDKNSKU2GjCRGEkkSSZsvb3GfnHPnzTm382Y1P36b9x33fKv37stkmiiYLf1AovnimatvhPjvxdMXX7AwaPnU6ScsVS2fLH4gDUXLJwrvSNO6BcaP3pCmicvHDl/RCGsWGD14QSP0Lh/Zf4aVFN8MKzC89wQrKb4ZVmBotworKb4ZVmBw5xFWUnwzrEBu+wFWUnwzrMDA1j00UqSZkxXo36xAI0WaOVmBvo07aKRIMycr0LtehkaKNHOyAj1rt9BIkWZO79uwe/UGUinSLLLmt6Br5Rp/pVhkkYlfxOzyJZwUi6zufaBz6RxOikUmuhV1LJ4hkuKeh2aqe2F7/oQdFD1zarOgmzE9qG2hGKvJgv8L6EGt84VYTWZWoGXuOFaTNX9qk/gFLmHiXP3t+GEAAAAASUVORK5CYII=' // 候选顺序:exe 同级(部署包)→ 源码目录(开发态)→ resources 目录 function resolveIconPath() { const candidates = [ path.join(path.dirname(app.getPath('exe')), 'scoreboard.png'), path.join(__dirname, '..', 'scoreboard.png'), path.join(process.resourcesPath || '', 'scoreboard.png'), ] return candidates.find((candidate) => candidate && fs.existsSync(candidate)) || null } function createTrayIcon() { const file = resolveIconPath() if (file) { const image = nativeImage.createFromPath(file) if (!image.isEmpty()) { // Windows 托盘按 16px 显示,缩放交给系统会更模糊,这里直接给 16px return image.resize({ width: 16, height: 16 }) } } const fallback = nativeImage.createFromDataURL(`data:image/png;base64,${ICON_PNG_BASE64}`) return fallback.resize({ width: 16, height: 16 }) } module.exports = { createTrayIcon }