通过Windows文件夹右键快捷方式启动Electron应用并获取触发文件夹路径
解决方案
问题根源
你当前配置的注册表command项仅指定了EXE路径,没有添加Windows右键菜单约定的路径占位符,因此系统不会将选中的文件夹路径作为启动参数传递给Electron应用,自然无法从process.argv中读取到对应值。
第一步:修改注册表配置
修改你之前创建的HKEY_CLASSES_ROOT\Folder\shell\Run In My Electron App\command项的默认值,格式调整为:"你的EXE文件完整路径" "%1"
注意:所有引号均为英文双引号,EXE路径和占位符
%1之间有空格。%1是Windows系统的约定占位符,代表当前右键选中的文件夹完整路径,加引号是为了适配路径含空格的场景。
如果需要同时支持在文件夹空白处右键启动(即不选中文件夹,直接在当前打开的文件夹空白区域右键触发),可以额外新增注册表项:
- 定位到
HKEY_CLASSES_ROOT\Directory\Background\shell - 按照之前的步骤新建
Run In My Electron App项和下级command项 command的默认值设置为:"你的EXE文件完整路径" "%V"
第二步:Electron中读取路径
修改主进程代码即可从process.argv中读取到传递的文件夹路径,示例代码如下:
const { app, BrowserWindow } = require('electron') let mainWindow // 处理单实例锁,避免重复打开应用,同时处理多次右键启动的参数 const gotTheLock = app.requestSingleInstanceLock() if (!gotTheLock) { app.quit() } else { app.on('second-instance', (event, commandLine) => { // 读取后续右键启动传入的新路径 const newFolderPath = commandLine.length >= 2 ? commandLine[1] : '' // 已有窗口时拉到前台并传递路径到渲染层 if (mainWindow) { if (mainWindow.isMinimized()) mainWindow.restore() mainWindow.focus() mainWindow.webContents.send('folder-path-received', newFolderPath) } }) app.whenReady().then(() => { // 首次启动读取路径 const triggerFolderPath = process.argv.length >= 2 ? process.argv[1] : '' console.log('触发启动的文件夹路径:', triggerFolderPath) // 原有创建窗口逻辑 mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false } }) mainWindow.loadFile('index.html') // 路径传递给渲染进程 mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.send('folder-path-received', triggerFolderPath) }) }) }
如果渲染进程需要使用该路径,可以在渲染层代码中监听对应的事件:
// 渲染进程js代码 const { ipcRenderer } = require('electron') ipcRenderer.on('folder-path-received', (event, path) => { console.log('拿到的文件夹路径:', path) // 后续业务逻辑 })
内容的提问来源于stack exchange,提问作者Elron
相关产品推荐
相关产品推荐

