From fd507e4f62b458152b6c93fd5a09d2e1473b0b8b Mon Sep 17 00:00:00 2001 From: yu <191972707@qq.com> Date: Fri, 30 Oct 2026 11:36:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BA=A7=E5=AE=89=E8=A3=85=E7=9A=84=20Chrome=20=E6=8E=A2?= =?UTF-8?q?=E6=B5=8B=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LOCALAPPDATA 环境变量缺失(受限启动环境)时退回 os.homedir() 拼接 AppData/Local 候选路径 - 注册表 App Paths 兜底从仅 HKLM 扩展为 HKLM + WOW6432Node + HKCU(用户级安装的 Chrome 注册在 HKCU) - 本机复现: Chrome 装于 C:/Users/6/AppData/Local, 注册于 HKCU App Paths, 修复后可探测到 --- src/main/browser/external.ts | 43 +++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/main/browser/external.ts b/src/main/browser/external.ts index 76b1c97..8d93f1a 100644 --- a/src/main/browser/external.ts +++ b/src/main/browser/external.ts @@ -52,7 +52,7 @@ const BROWSER_CANDIDATE_PATHS: Record = { chrome: [ "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", - path.join(process.env.LOCALAPPDATA ?? "", "Google", "Chrome", "Application", "chrome.exe") + path.join(localAppDataDir(), "Google", "Chrome", "Application", "chrome.exe") ], edge: [ "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", @@ -60,9 +60,24 @@ const BROWSER_CANDIDATE_PATHS: Record = { ] }; -const BROWSER_APP_PATHS_REGISTRY: Record = { - chrome: "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", - edge: "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe" +/** 用户级 AppData\Local 目录;LOCALAPPDATA 缺失(如受限启动环境)时退回 USERPROFILE 拼接 */ +function localAppDataDir(): string { + if (process.env.LOCALAPPDATA) return process.env.LOCALAPPDATA; + return path.join(os.homedir(), "AppData", "Local"); +} + +/** 注册表 App Paths 兜底:HKLM(64 位 + WOW6432Node)与 HKCU(用户级安装)都查 */ +const BROWSER_APP_PATHS_REGISTRIES: Record = { + chrome: [ + "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", + "HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe", + "HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe" + ], + edge: [ + "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", + "HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe", + "HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\msedge.exe" + ] }; async function fileExists(p: string): Promise { @@ -84,20 +99,22 @@ function queryRegistry(command: string): Promise { }); } -/** 探测本机浏览器安装路径:常见目录优先,注册表 App Paths 兜底 */ +/** 探测本机浏览器安装路径:常见目录优先,注册表 App Paths(HKLM/HKCU)兜底 */ export async function detectBrowserPath(browserType: ExternalBrowserType): Promise { for (const candidate of BROWSER_CANDIDATE_PATHS[browserType]) { if (await fileExists(candidate)) return candidate; } - try { - const stdout = await queryRegistry(BROWSER_APP_PATHS_REGISTRY[browserType]); - const match = stdout.match(/REG_SZ\s+(\S[^\r\n]*)/); - if (match) { - const registryPath = match[1].trim(); - if (await fileExists(registryPath)) return registryPath; + for (const registryKey of BROWSER_APP_PATHS_REGISTRIES[browserType]) { + try { + const stdout = await queryRegistry(registryKey); + const match = stdout.match(/REG_SZ\s+(\S[^\r\n]*)/); + if (match) { + const registryPath = match[1].trim(); + if (await fileExists(registryPath)) return registryPath; + } + } catch { + // 该键不存在继续查下一个 } - } catch { - // 注册表查询失败继续走报错 } throw new RuntimeError( "browser_not_found",