From 807907226e78ec324ccd84d6db369ca4f13955cd Mon Sep 17 00:00:00 2001 From: Hommy Date: Mon, 24 Aug 2026 22:42:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=A1=8C=E9=9D=A2=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- desktop-client/main.js | 5 ++++ desktop-client/scripts/afterPackWinIcon.js | 27 +++++++++++++++++++ .../scripts/electron-builder-green.config.js | 1 + .../scripts/electron-builder.config.js | 6 ++++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 desktop-client/scripts/afterPackWinIcon.js diff --git a/desktop-client/main.js b/desktop-client/main.js index 632c0d4..150c7ed 100644 --- a/desktop-client/main.js +++ b/desktop-client/main.js @@ -6,6 +6,11 @@ const logger = require('./nodeapi/logger'); const { setupIpcHandlers } = require('./nodeapi/ipcHandlers'); const { attachEditContextMenu } = require('./nodeapi/editContextMenu'); +// Windows 任务栏 / 快捷方式图标依赖 AppUserModelId,需与 electron-builder appId 一致 +if (process.platform === 'win32') { + app.setAppUserModelId('com.gogoshine.capcut-mate'); +} + let mainWindow; let ipcHandlersInitialized = false; diff --git a/desktop-client/scripts/afterPackWinIcon.js b/desktop-client/scripts/afterPackWinIcon.js new file mode 100644 index 0000000..8994511 --- /dev/null +++ b/desktop-client/scripts/afterPackWinIcon.js @@ -0,0 +1,27 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * electron-builder 在 signAndEditExecutable=false 时不会把 .ico 写入 exe。 + * 用 resedit(Node 实现,不依赖 winCodeSign)补回桌面 / 任务栏图标。 + */ +module.exports = async function afterPackWinIcon(context) { + if (context.electronPlatformName !== 'win32') { + return; + } + + const exeName = `${context.packager.appInfo.productFilename}.exe`; + const exePath = path.join(context.appOutDir, exeName); + const iconPath = path.resolve(__dirname, '../assets/icons/logo.ico'); + + if (!fs.existsSync(exePath)) { + throw new Error(`Windows executable not found: ${exePath}`); + } + if (!fs.existsSync(iconPath)) { + throw new Error(`Windows icon not found: ${iconPath}`); + } + + const { resedit } = require('@electron/packager/dist/resedit'); + await resedit(exePath, { iconPath }); + console.log(`Embedded Windows icon into ${exeName}`); +}; diff --git a/desktop-client/scripts/electron-builder-green.config.js b/desktop-client/scripts/electron-builder-green.config.js index 4fe9e80..4825367 100644 --- a/desktop-client/scripts/electron-builder-green.config.js +++ b/desktop-client/scripts/electron-builder-green.config.js @@ -4,6 +4,7 @@ module.exports = { directories: { output: "dist" }, + afterPack: require("./afterPackWinIcon"), win: { icon: "assets/icons/logo.ico", artifactName: "capcut-mate-windows-x64-green.zip", diff --git a/desktop-client/scripts/electron-builder.config.js b/desktop-client/scripts/electron-builder.config.js index a4ff33c..24c2eac 100644 --- a/desktop-client/scripts/electron-builder.config.js +++ b/desktop-client/scripts/electron-builder.config.js @@ -7,6 +7,7 @@ module.exports = { directories: { output: "dist" }, + afterPack: require("./afterPackWinIcon"), files: [ "**/*", // "!node_modules", @@ -23,7 +24,7 @@ module.exports = { icon: "assets/icons/logo.ico", target: "nsis", artifactName: "capcut-mate-windows-x64-installer.exe", - // 禁用代码签名(避免本机无符号链接权限时解压 winCodeSign 失败) + // 跳过 winCodeSign(本机解压会因符号链接权限失败);exe 图标由 afterPack 写入 signingHashAlgorithms: [], signAndEditExecutable: false, signDlls: false @@ -31,6 +32,9 @@ module.exports = { nsis: { oneClick: false, allowToChangeInstallationDirectory: true, + installerIcon: "assets/icons/logo.ico", + uninstallerIcon: "assets/icons/logo.ico", + shortcutName: "剪映小助手", }, mac: { icon: "assets/icons/logo.icns",