From 3af530a15ec81ced2bd342f2a768b189b3b6ac0a Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 19:57:27 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=9A=84=20icon.icns=20extraResources=20=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8C=85=20EEXIST?= =?UTF-8?q?=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/package.json b/package.json index c3bce01..569874d 100644 --- a/package.json +++ b/package.json @@ -121,10 +121,6 @@ { "from": "electron/assets/wasm/", "to": "assets/wasm/" - }, - { - "from": "resources/icon.icns", - "to": "icon.icns" } ], "files": [ @@ -158,4 +154,4 @@ ], "icon": "resources/icon.icns" } -} +} \ No newline at end of file From a4b0a25dabffc281974003159a381b10075de4a5 Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 20:29:27 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20elevated=20helper=20stderr=20?= =?UTF-8?q?=E9=87=8D=E5=AE=9A=E5=90=91=E5=88=B0=20stdout=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=97=A5=E5=BF=97=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/keyServiceMac.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron/services/keyServiceMac.ts b/electron/services/keyServiceMac.ts index 1699c87..fab059e 100644 --- a/electron/services/keyServiceMac.ts +++ b/electron/services/keyServiceMac.ts @@ -363,7 +363,7 @@ export class KeyServiceMac { // 用 AppleScript 的 quoted form 组装命令,避免复杂 shell 拼接导致整条失败 const scriptLines = [ `set helperPath to ${JSON.stringify(helperPath)}`, - `set cmd to quoted form of helperPath & " ${pid} ${waitMs}"`, + `set cmd to quoted form of helperPath & " ${pid} ${waitMs} 2>&1"`, 'do shell script cmd with administrator privileges' ] onStatus?.('已准备就绪,现在登录微信或退出登录后重新登录微信', 0) From f2a9d7097fb902afd6b918ef768909627bdab5b4 Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 20:30:00 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/xkey_helper | Bin 343488 -> 343488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/xkey_helper b/resources/xkey_helper index 02ae7c5da9b9029a6184952a78efb814d5983e1e..88807fa2ba7ce84ffb7a66e9a4bc31b078879b0c 100755 GIT binary patch delta 26751 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 delta 25113 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 From db71bc3f19947ab13ab2b4c53b482e4c77229e0d Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 20:40:45 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/xkey_helper | Bin 343488 -> 343488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/xkey_helper b/resources/xkey_helper index 88807fa2ba7ce84ffb7a66e9a4bc31b078879b0c..8c7813571c1d2eb51138cc67d074e35f884000f2 100755 GIT binary patch delta 24352 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 delta 23754 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 From d50bffad3edc2e990fafcdc40205fd22c898ebb0 Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 20:45:33 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix:=20elevated=20helper=20=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E8=A7=A3=E6=9E=90=E6=94=B9=E4=B8=BA=E6=89=BE=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E4=B8=80=E4=B8=AA=E5=90=88=E6=B3=95=20JSON=20?= =?UTF-8?q?=E8=A1=8C=EF=BC=8C=E4=BF=AE=E5=A4=8D=20stderr=20=E6=B7=B7?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E8=87=B4=E7=9A=84=E8=A7=A3=E6=9E=90=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/keyServiceMac.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/electron/services/keyServiceMac.ts b/electron/services/keyServiceMac.ts index fab059e..f215870 100644 --- a/electron/services/keyServiceMac.ts +++ b/electron/services/keyServiceMac.ts @@ -380,15 +380,20 @@ export class KeyServiceMac { } const lines = String(stdout).split(/\r?\n/).map(x => x.trim()).filter(Boolean) - const last = lines[lines.length - 1] - if (!last) throw new Error('elevated helper returned empty output') + if (!lines.length) throw new Error('elevated helper returned empty output') + // 找最后一个能成功 parse 的 JSON 行(stderr 混入 stdout 时会有非 JSON 行) let payload: any - try { - payload = JSON.parse(last) - } catch { - throw new Error('elevated helper returned invalid json: ' + last) + let lastJsonLine = '' + for (let i = lines.length - 1; i >= 0; i--) { + if (!lines[i].startsWith('{')) continue + try { + payload = JSON.parse(lines[i]) + lastJsonLine = lines[i] + break + } catch { continue } } + if (!payload) throw new Error('elevated helper returned invalid json: ' + lines[lines.length - 1]) if (payload?.success === true && typeof payload?.key === 'string') return payload.key if (typeof payload?.result === 'string') return payload.result throw new Error('elevated helper json missing key/result') From 8e69e1ec589e439d7c6949dcea565bfca1bf956b Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 20:57:22 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=AE=89=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/xkey_helper | Bin 343488 -> 343488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/xkey_helper b/resources/xkey_helper index 8c7813571c1d2eb51138cc67d074e35f884000f2..1c9b951830de80ef672d14a35bf28bb3a0eda49a 100755 GIT binary patch delta 27875 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 Date: Sat, 14 Mar 2026 21:09:53 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20elevated=20he?= =?UTF-8?q?lper=20=E8=BE=93=E5=87=BA=E8=A7=A3=E6=9E=90=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=90=8C=E8=A1=8C=E5=A4=9A=20JSON=20=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/keyServiceMac.ts | 32 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/electron/services/keyServiceMac.ts b/electron/services/keyServiceMac.ts index f215870..5f1e34f 100644 --- a/electron/services/keyServiceMac.ts +++ b/electron/services/keyServiceMac.ts @@ -382,21 +382,25 @@ export class KeyServiceMac { const lines = String(stdout).split(/\r?\n/).map(x => x.trim()).filter(Boolean) if (!lines.length) throw new Error('elevated helper returned empty output') - // 找最后一个能成功 parse 的 JSON 行(stderr 混入 stdout 时会有非 JSON 行) - let payload: any - let lastJsonLine = '' - for (let i = lines.length - 1; i >= 0; i--) { - if (!lines[i].startsWith('{')) continue - try { - payload = JSON.parse(lines[i]) - lastJsonLine = lines[i] - break - } catch { continue } + // 从所有行里提取所有 JSON 对象(同一行可能有多个拼接),找含 key/result 的那个 + const extractJsonObjects = (s: string): any[] => { + const results: any[] = [] + const re = /\{[^{}]*\}/g + let m: RegExpExecArray | null + while ((m = re.exec(s)) !== null) { + try { results.push(JSON.parse(m[0])) } catch { } + } + return results } - if (!payload) throw new Error('elevated helper returned invalid json: ' + lines[lines.length - 1]) - if (payload?.success === true && typeof payload?.key === 'string') return payload.key - if (typeof payload?.result === 'string') return payload.result - throw new Error('elevated helper json missing key/result') + const fullOutput = lines.join('\n') + const allJson = extractJsonObjects(fullOutput) + // 优先找 success=true && key 字段 + const successPayload = allJson.find(p => p?.success === true && typeof p?.key === 'string') + if (successPayload) return successPayload.key + // 其次找 result 字段 + const resultPayload = allJson.find(p => typeof p?.result === 'string') + if (resultPayload) return resultPayload.result + throw new Error('elevated helper returned invalid json: ' + lines[lines.length - 1]) } private mapDbKeyErrorMessage(code?: string, detail?: string): string { From 641abc57b96303036e3530669d18cbd4a28b2c7c Mon Sep 17 00:00:00 2001 From: cc <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:23:10 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20#389=20=EF=BC=9B?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E4=BA=86=E5=BC=95=E5=AF=BC=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/services/keyService.ts | 28 +------ src/components/ConfirmDialog.scss | 123 ++++++++++++++++++++++++++++++ src/components/ConfirmDialog.tsx | 32 ++++++++ src/pages/ChatPage.tsx | 36 ++++----- src/pages/SettingsPage.scss | 1 + src/pages/SettingsPage.tsx | 47 ++++++++---- src/pages/WelcomePage.scss | 15 +++- src/pages/WelcomePage.tsx | 59 +++++++++++--- 8 files changed, 274 insertions(+), 67 deletions(-) create mode 100644 src/components/ConfirmDialog.scss create mode 100644 src/components/ConfirmDialog.tsx diff --git a/electron/services/keyService.ts b/electron/services/keyService.ts index 66345c2..25b0aa1 100644 --- a/electron/services/keyService.ts +++ b/electron/services/keyService.ts @@ -606,34 +606,14 @@ export class KeyService { const logs: string[] = [] - onStatus?.('正在定位微信安装路径...', 0) - let wechatPath = await this.findWeChatInstallPath() - if (!wechatPath) { - const err = '未找到微信安装路径,请确认已安装PC微信' + onStatus?.('正在查找微信进程...', 0) + const pid = await this.findWeChatPid() + if (!pid) { + const err = '未找到微信进程,请先启动微信' onStatus?.(err, 2) return { success: false, error: err } } - onStatus?.('正在关闭微信以进行获取...', 0) - const closed = await this.killWeChatProcesses() - if (!closed) { - const err = '无法自动关闭微信,请手动退出后重试' - onStatus?.(err, 2) - return { success: false, error: err } - } - - onStatus?.('正在启动微信...', 0) - const sub = spawn(wechatPath, { - detached: true, - stdio: 'ignore', - cwd: dirname(wechatPath) - }) - sub.unref() - - onStatus?.('等待微信界面就绪...', 0) - const pid = await this.waitForWeChatWindow() - if (!pid) return { success: false, error: '启动微信失败或等待界面就绪超时' } - onStatus?.(`检测到微信窗口 (PID: ${pid}),正在获取...`, 0) onStatus?.('正在检测微信界面组件...', 0) await this.waitForWeChatWindowComponents(pid, 15000) diff --git a/src/components/ConfirmDialog.scss b/src/components/ConfirmDialog.scss new file mode 100644 index 0000000..5acd32d --- /dev/null +++ b/src/components/ConfirmDialog.scss @@ -0,0 +1,123 @@ +.confirm-dialog-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(4px); + display: flex; + align-items: center; + justify-content: center; + z-index: 100; + animation: fadeIn 0.2s ease-out; + + .confirm-dialog { + width: 480px; + background: var(--bg-primary); + border-radius: 20px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + position: relative; + animation: slideUp 0.2s ease-out; + overflow: hidden; + + .close-btn { + position: absolute; + top: 16px; + right: 16px; + background: rgba(0, 0, 0, 0.05); + border: none; + color: var(--text-secondary); + cursor: pointer; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + + &:hover { + background: rgba(0, 0, 0, 0.1); + color: var(--text-primary); + } + } + + .dialog-title { + padding: 40px 40px 16px; + font-size: 18px; + font-weight: 600; + color: var(--text-primary); + } + + .dialog-content { + padding: 0 40px 24px; + + p { + font-size: 15px; + color: var(--text-primary); + line-height: 1.6; + margin: 0 0 16px 0; + + &:last-child { + margin-bottom: 0; + } + } + } + + .dialog-actions { + padding: 0 40px 40px; + display: flex; + justify-content: flex-end; + gap: 12px; + + button { + padding: 12px 24px; + border-radius: 12px; + font-size: 15px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; + border: none; + + &.btn-cancel { + background: var(--bg-tertiary); + color: var(--text-secondary); + + &:hover { + background: var(--bg-hover); + } + } + + &.btn-confirm { + background: var(--primary); + color: var(--on-primary); + + &:hover { + background: var(--primary-hover); + } + + &:active { + transform: scale(0.98); + } + } + } + } + } +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +@keyframes slideUp { + from { + transform: translateY(20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx new file mode 100644 index 0000000..7126edf --- /dev/null +++ b/src/components/ConfirmDialog.tsx @@ -0,0 +1,32 @@ +import { X } from 'lucide-react' +import './ConfirmDialog.scss' + +interface ConfirmDialogProps { + open: boolean + title?: string + message: string + onConfirm: () => void + onCancel: () => void +} + +export default function ConfirmDialog({ open, title, message, onConfirm, onCancel }: ConfirmDialogProps) { + if (!open) return null + + return ( +
+
e.stopPropagation()}> + + {title &&
{title}
} +
+

{message}

+
+
+ + +
+
+
+ ) +} diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx index 559fc03..50e1534 100644 --- a/src/pages/ChatPage.tsx +++ b/src/pages/ChatPage.tsx @@ -5202,6 +5202,24 @@ function MessageBubble({ const [emojiError, setEmojiError] = useState(false) const [emojiLoading, setEmojiLoading] = useState(false) + // 缓存相关的 state 必须在所有 Hooks 之前声明 + const cacheKey = message.emojiMd5 || message.emojiCdnUrl || '' + const [emojiLocalPath, setEmojiLocalPath] = useState( + () => emojiDataUrlCache.get(cacheKey) || message.emojiLocalPath + ) + const imageCacheKey = message.imageMd5 || message.imageDatName || `local:${message.localId}` + const [imageLocalPath, setImageLocalPath] = useState( + () => imageDataUrlCache.get(imageCacheKey) + ) + const voiceCacheKey = `voice:${message.localId}` + const [voiceDataUrl, setVoiceDataUrl] = useState( + () => voiceDataUrlCache.get(voiceCacheKey) + ) + const voiceTranscriptCacheKey = `voice-transcript:${message.localId}` + const [voiceTranscript, setVoiceTranscript] = useState( + () => voiceTranscriptCache.get(voiceTranscriptCacheKey) + ) + // State variables... const [imageError, setImageError] = useState(false) const [imageLoading, setImageLoading] = useState(false) @@ -5282,24 +5300,6 @@ function MessageBubble({ loadConfig() }, []) - // 从缓存获取表情包 data URL - const cacheKey = message.emojiMd5 || message.emojiCdnUrl || '' - const [emojiLocalPath, setEmojiLocalPath] = useState( - () => emojiDataUrlCache.get(cacheKey) || message.emojiLocalPath - ) - const imageCacheKey = message.imageMd5 || message.imageDatName || `local:${message.localId}` - const [imageLocalPath, setImageLocalPath] = useState( - () => imageDataUrlCache.get(imageCacheKey) - ) - const voiceCacheKey = `voice:${message.localId}` - const [voiceDataUrl, setVoiceDataUrl] = useState( - () => voiceDataUrlCache.get(voiceCacheKey) - ) - const voiceTranscriptCacheKey = `voice-transcript:${message.localId}` - const [voiceTranscript, setVoiceTranscript] = useState( - () => voiceTranscriptCache.get(voiceTranscriptCacheKey) - ) - const formatTime = (timestamp: number): string => { if (!Number.isFinite(timestamp) || timestamp <= 0) return '未知时间' const date = new Date(timestamp * 1000) diff --git a/src/pages/SettingsPage.scss b/src/pages/SettingsPage.scss index d1608eb..04a5751 100644 --- a/src/pages/SettingsPage.scss +++ b/src/pages/SettingsPage.scss @@ -41,6 +41,7 @@ } .settings-page { + position: relative; display: flex; flex-direction: column; width: min(1160px, calc(100vw - 96px)); diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx index ae49e8e..d963b14 100644 --- a/src/pages/SettingsPage.tsx +++ b/src/pages/SettingsPage.tsx @@ -557,24 +557,37 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) { } } + const validatePath = (path: string): string | null => { + if (!path) return null + if (/[\u4e00-\u9fa5]/.test(path)) { + return '路径包含中文字符,请迁移至全英文目录' + } + return null + } + const handleAutoDetectPath = async () => { if (isDetectingPath) return setIsDetectingPath(true) try { const result = await window.electronAPI.dbPath.autoDetect() if (result.success && result.path) { - setDbPath(result.path) - await configService.setDbPath(result.path) - showMessage(`自动检测成功:${result.path}`, true) + const validationError = validatePath(result.path) + if (validationError) { + showMessage(validationError, false) + } else { + setDbPath(result.path) + await configService.setDbPath(result.path) + showMessage(`自动检测成功:${result.path}`, true) - const wxids = await window.electronAPI.dbPath.scanWxids(result.path) - setWxidOptions(wxids) - if (wxids.length === 1) { - await applyWxidSelection(wxids[0].wxid, { - toastText: `已检测到账号:${wxids[0].wxid}` - }) - } else if (wxids.length > 1) { - setShowWxidSelect(true) + const wxids = await window.electronAPI.dbPath.scanWxids(result.path) + setWxidOptions(wxids) + if (wxids.length === 1) { + await applyWxidSelection(wxids[0].wxid, { + toastText: `已检测到账号:${wxids[0].wxid}` + }) + } else if (wxids.length > 1) { + setShowWxidSelect(true) + } } } else { showMessage(result.error || '未能自动检测到数据库目录', false) @@ -591,9 +604,14 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) { const result = await dialog.openFile({ title: '选择微信数据库根目录', properties: ['openDirectory'] }) if (!result.canceled && result.filePaths.length > 0) { const selectedPath = result.filePaths[0] - setDbPath(selectedPath) - await configService.setDbPath(selectedPath) - showMessage('已选择数据库目录', true) + const validationError = validatePath(selectedPath) + if (validationError) { + showMessage(validationError, false) + } else { + setDbPath(selectedPath) + await configService.setDbPath(selectedPath) + showMessage('已选择数据库目录', true) + } } } catch (e: any) { showMessage('选择目录失败', false) @@ -1287,7 +1305,6 @@ function SettingsPage({ onClose }: SettingsPageProps = {}) {
xwechat_files 目录 - 目录路径不可包含中文,如有中文请去微信-设置-存储位置点击更改,迁移至全英文目录 (null) + const [showDbKeyConfirm, setShowDbKeyConfirm] = useState(false) // 安全相关 state const [enableAuth, setEnableAuth] = useState(false) @@ -123,6 +125,14 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { useEffect(() => { const removeDb = window.electronAPI.key.onDbKeyStatus((payload: { message: string; level: number }) => { setDbKeyStatus(payload.message) + if (payload.message.includes('现在可以登录') || payload.message.includes('Hook安装成功')) { + window.electronAPI.notification?.show({ + title: 'WeFlow 准备就绪', + content: '现在可以登录微信了', + avatarUrl: './logo.png', + sessionId: 'weflow-system' + }) + } }) const removeImage = window.electronAPI.key.onImageKeyStatus((payload: { message: string, percent?: number }) => { let msg = payload.message; @@ -187,6 +197,15 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { window.electronAPI.window.close() } + const validatePath = (path: string): string | null => { + if (!path) return null + // 检测中文字符和其他可能有问题的特殊字符 + if (/[\u4e00-\u9fa5]/.test(path)) { + return '路径包含中文字符,请迁移至全英文目录' + } + return null + } + const handleSelectPath = async () => { try { const result = await dialog.openFile({ @@ -195,8 +214,14 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { }) if (!result.canceled && result.filePaths.length > 0) { - setDbPath(result.filePaths[0]) - setError('') + const selectedPath = result.filePaths[0] + const validationError = validatePath(selectedPath) + if (validationError) { + setError(validationError) + } else { + setDbPath(selectedPath) + setError('') + } } } catch (e) { setError('选择目录失败') @@ -210,8 +235,13 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { try { const result = await window.electronAPI.dbPath.autoDetect() if (result.success && result.path) { - setDbPath(result.path) - setError('') + const validationError = validatePath(result.path) + if (validationError) { + setError(validationError) + } else { + setDbPath(result.path) + setError('') + } } else { setError(result.error || '未能检测到数据库目录') } @@ -287,6 +317,11 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { const handleAutoGetDbKey = async () => { if (isFetchingDbKey) return + setShowDbKeyConfirm(true) + } + + const handleDbKeyConfirm = async () => { + setShowDbKeyConfirm(false) setIsFetchingDbKey(true) setError('') setIsManualStartPrompt(false) @@ -297,7 +332,6 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { setDecryptKey(result.key) setDbKeyStatus('密钥获取成功') setError('') - // 获取成功后自动扫描并填入 wxid await handleScanWxid(true) } else { if (result.error?.includes('未找到微信安装路径') || result.error?.includes('启动微信失败')) { @@ -613,9 +647,6 @@ function WelcomePage({ standalone = false }: WelcomePageProps) {
请选择微信-设置-存储位置对应的目录
-
- 目录路径不可包含中文,如有中文请先在微信中迁移至全英文目录 -
)} @@ -705,7 +736,7 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { )} - {dbKeyStatus &&
{dbKeyStatus}
} + {dbKeyStatus &&
{dbKeyStatus}
}
点击自动获取后微信将重启,请留意弹窗提示
)} @@ -840,6 +871,16 @@ function WelcomePage({ standalone = false }: WelcomePageProps) { )} + + setShowDbKeyConfirm(false)} + /> ) From ba5f8928f739d43e6e67a5986930daf589181ead Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 22:51:24 +0800 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87=EF=BC=8C=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E4=B8=BB=E7=AA=97=E5=8F=A3=E6=97=B6=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E5=88=B0=E6=89=98=E7=9B=98=E8=80=8C=E9=9D=9E=E9=80=80=E5=87=BA?= =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8D=E8=BF=9B=E7=A8=8B=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E5=85=B3=E9=97=AD=E9=97=AE=E9=A2=98=EF=BC=88?= =?UTF-8?q?before-quit=20=E5=8A=A0=E5=85=9C=E5=BA=95=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E9=80=80=E5=87=BA=20+=20wcdbService.shutdown=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20async=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main.ts | 70 ++++++++++++++++++++++++++++++-- electron/services/wcdbService.ts | 6 +-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index d6f971b..560efd8 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -1,5 +1,5 @@ import './preload-env' -import { app, BrowserWindow, ipcMain, nativeTheme, session } from 'electron' +import { app, BrowserWindow, ipcMain, nativeTheme, session, Tray, Menu, nativeImage } from 'electron' import { Worker } from 'worker_threads' import { join, dirname } from 'path' import { autoUpdater } from 'electron-updater' @@ -96,6 +96,7 @@ const keyService = process.platform === 'darwin' let mainWindowReady = false let shouldShowMain = true let isAppQuitting = false +let tray: Tray | null = null // 更新下载状态管理(Issue #294 修复) let isDownloadInProgress = false @@ -352,6 +353,13 @@ function createWindow(options: { autoShow?: boolean } = {}) { callback(false) }) + win.on('close', (e) => { + if (isAppQuitting) return + // 关闭主窗口时隐藏到状态栏而不是退出 + e.preventDefault() + win.hide() + }) + win.on('closed', () => { if (mainWindow !== win) return @@ -359,7 +367,6 @@ function createWindow(options: { autoShow?: boolean } = {}) { mainWindowReady = false if (process.platform !== 'darwin' && !isAppQuitting) { - // 隐藏通知窗也是 BrowserWindow,必须销毁,否则会阻止应用退出。 destroyNotificationWindow() if (BrowserWindow.getAllWindows().length === 0) { app.quit() @@ -2439,6 +2446,55 @@ app.whenReady().then(async () => { updateSplashProgress(30, '正在加载界面...') mainWindow = createWindow({ autoShow: false }) + // 初始化系统托盘图标 + const trayIconPath = process.platform === 'win32' + ? join(process.resourcesPath, 'icon.ico') + : join(process.resourcesPath, 'resources', 'icon.icns') + const trayIconFallback = join(__dirname, '..', 'resources', process.platform === 'win32' ? 'icon.ico' : 'icon.icns') + const resolvedTrayIcon = existsSync(trayIconPath) ? trayIconPath : trayIconFallback + try { + tray = new Tray(resolvedTrayIcon) + tray.setToolTip('WeFlow') + const contextMenu = Menu.buildFromTemplate([ + { + label: '显示主窗口', + click: () => { + if (mainWindow) { + mainWindow.show() + mainWindow.focus() + } + } + }, + { type: 'separator' }, + { + label: '退出', + click: () => { + isAppQuitting = true + app.quit() + } + } + ]) + tray.setContextMenu(contextMenu) + tray.on('click', () => { + if (mainWindow) { + if (mainWindow.isVisible()) { + mainWindow.focus() + } else { + mainWindow.show() + mainWindow.focus() + } + } + }) + tray.on('double-click', () => { + if (mainWindow) { + mainWindow.show() + mainWindow.focus() + } + }) + } catch (e) { + console.warn('[Tray] Failed to create tray icon:', e) + } + // 配置网络服务 session.defaultSession.webRequest.onBeforeSendHeaders( { @@ -2486,12 +2542,20 @@ app.whenReady().then(async () => { app.on('before-quit', async () => { isAppQuitting = true + // 销毁 tray 图标 + if (tray) { try { tray.destroy() } catch {} tray = null } // 通知窗使用 hide 而非 close,退出时主动销毁,避免残留窗口阻塞进程退出。 destroyNotificationWindow() + // 兜底:5秒后强制退出,防止某个异步任务卡住导致进程残留 + const forceExitTimer = setTimeout(() => { + console.warn('[App] Force exit after timeout') + app.exit(0) + }, 5000) + forceExitTimer.unref() // 停止 HTTP 服务器,释放 TCP 端口占用,避免进程无法退出 try { await httpService.stop() } catch {} // 终止 wcdb Worker 线程,避免线程阻止进程退出 - try { wcdbService.shutdown() } catch {} + try { await wcdbService.shutdown() } catch {} }) app.on('window-all-closed', () => { diff --git a/electron/services/wcdbService.ts b/electron/services/wcdbService.ts index 2f5715f..286ddae 100644 --- a/electron/services/wcdbService.ts +++ b/electron/services/wcdbService.ts @@ -174,10 +174,10 @@ export class WcdbService { /** * 关闭服务 */ - shutdown(): void { - this.close() + async shutdown(): Promise { + try { await this.close() } catch {} if (this.worker) { - this.worker.terminate() + try { await this.worker.terminate() } catch {} this.worker = null } } From 998b2ce3d76fd6167a156f13b621887ffd792dad Mon Sep 17 00:00:00 2001 From: hicccc77 <98377878+hicccc77@users.noreply.github.com> Date: Sat, 14 Mar 2026 23:00:08 +0800 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Windows=20?= =?UTF-8?q?=E4=B8=8B=20tray=20=E5=9B=BE=E6=A0=87=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=8C=E4=B8=8E=E5=85=B6=E4=BB=96=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=20icon=20=E8=B7=AF=E5=BE=84=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/electron/main.ts b/electron/main.ts index 560efd8..d636dd5 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -2446,12 +2446,12 @@ app.whenReady().then(async () => { updateSplashProgress(30, '正在加载界面...') mainWindow = createWindow({ autoShow: false }) - // 初始化系统托盘图标 - const trayIconPath = process.platform === 'win32' - ? join(process.resourcesPath, 'icon.ico') - : join(process.resourcesPath, 'resources', 'icon.icns') - const trayIconFallback = join(__dirname, '..', 'resources', process.platform === 'win32' ? 'icon.ico' : 'icon.icns') - const resolvedTrayIcon = existsSync(trayIconPath) ? trayIconPath : trayIconFallback + // 初始化系统托盘图标(与其他窗口 icon 路径逻辑保持一致) + const resolvedTrayIcon = process.platform === 'win32' + ? join(__dirname, '../public/icon.ico') + : (process.platform === 'darwin' + ? join(process.resourcesPath, 'icon.icns') + : join(process.resourcesPath, 'icon.ico')) try { tray = new Tray(resolvedTrayIcon) tray.setToolTip('WeFlow')