You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现React Web应用与Electron桌面应用的通信及参数传递?

实现方案:通过自定义URL协议在React Web与Electron间传参并通信

一、自定义URL协议支持传递参数

完全可以通过自定义URL协议传递参数,核心思路是把需要的信息(比如进程ID)拼接在协议URL的路径或查询参数中,Electron端解析这些参数后完成存储操作。

二、React Web端构造带参数的唤起URL

直接将参数拼在自定义协议的URL里,两种常见形式:

  • 路径形式:myrecorder://process/1234
  • 查询参数形式:myrecorder://?pid=1234&operator=zhangsan

React中通过点击事件触发打开URL:

const openElectronRecorder = (pid) => {
  const targetUrl = `myrecorder://?pid=${pid}`;
  window.open(targetUrl);
};

三、Electron端解析参数并存储

1. 处理首次启动的参数

在Electron主进程中,从命令行参数里提取自定义URL并解析:

const { app, BrowserWindow } = require('electron');
let mainWindow;

// 解析URL参数的工具函数
function parseUrlParams(url) {
  const cleanUrl = url.replace(/^myrecorder:\/\//, '');
  const params = new URLSearchParams(cleanUrl);
  return {
    pid: params.get('pid'),
    // 可扩展其他参数
  };
}

function createMainWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      contextIsolation: true,
      preload: './preload.js' // 新版本Electron建议用preload脚本做进程通信
    }
  });
  mainWindow.loadFile('index.html');
}

app.whenReady().then(() => {
  // 提取命令行中的自定义URL参数
  const args = process.argv.slice(1);
  const targetUrl = args.find(arg => arg.startsWith('myrecorder://'));
  
  if (targetUrl) {
    const params = parseUrlParams(targetUrl);
    // 调用你的数据库存储逻辑,比如saveProcessIdToDb(params.pid)
    console.log('首次启动收到参数:', params);
  }
  createMainWindow();
});

2. 处理应用已打开时的唤起请求

通过单实例锁避免重复启动应用,同时监听second-instance事件获取新参数:

// 申请单实例锁,确保同一时间只有一个应用实例
const hasSingleInstanceLock = app.requestSingleInstanceLock();

if (!hasSingleInstanceLock) {
  app.quit();
} else {
  app.on('second-instance', (event, commandLine) => {
    const targetUrl = commandLine.find(arg => arg.startsWith('myrecorder://'));
    if (targetUrl) {
      const params = parseUrlParams(targetUrl);
      // 存入数据库
      // saveProcessIdToDb(params.pid);
      
      // 恢复并聚焦窗口
      if (mainWindow) {
        if (mainWindow.isMinimized()) mainWindow.restore();
        mainWindow.focus();
      }
    }
  });
}

四、Web端调取存储的数据

有两种常见方式:

  1. Electron启动本地HTTP服务:在Electron主进程中用Express搭建简单接口,供React Web查询数据库数据:
const express = require('express');
const localServer = express();
const serverPort = 3001;

localServer.get('/api/get-process-record', (req, res) => {
  const pid = req.query.pid;
  // 执行数据库查询逻辑,比如queryRecordByPid(pid)
  res.json({ success: true, data: /* 查询结果 */ });
});

localServer.listen(serverPort, () => {
  console.log(`本地服务运行在端口${serverPort}`);
});

React端通过接口获取数据:

const fetchRecord = async (pid) => {
  const response = await fetch(`http://localhost:3001/api/get-process-record?pid=${pid}`);
  const result = await response.json();
  // 处理返回的数据
};
  1. 直接共享数据库:如果数据库支持远程访问,React Web可直接连接数据库查询(需注意权限控制)。

五、Windows注册表配置要点

确保注册表中自定义协议的Command值包含"%1",这样系统会把完整的带参数URL传递给Electron应用:

"Command"="C:\\YourAppPath\\ElectronRecorder.exe" "%1"

内容的提问来源于stack exchange,提问作者Sara Qayyum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:15:59