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

如何通过React JS检测Windows桌面应用是否处于运行状态

React应用检测Windows桌面应用运行状态的可行方案

纯浏览器环境运行的React Web应用受同源策略和沙箱安全机制限制,无法直接读取Windows系统层面的进程列表,不存在无依赖直接实现检测的方案,以下是不同部署场景下的可落地实现路径:

场景1:React代码被打包为Electron桌面应用

这是最常见的React跨端桌面开发场景,可直接通过Electron提供的Node.js能力实现检测,不需要额外依赖:

  • 原生命令实现方案
    在Electron主进程中通过child_process模块调用Windows自带的tasklist命令查询进程列表,解析结果后通过IPC通信将状态传给渲染层的React代码即可,参考实现:

    // Electron主进程代码
    const { exec } = require('child_process');
    const { ipcMain } = require('electron');
    
    // 注册检测进程的IPC处理函数
    ipcMain.handle('check-app-running', async (_, targetExeName) => {
      return new Promise((resolve) => {
        // 执行tasklist命令输出无表头的csv格式进程列表
        exec('tasklist /fo csv /nh', (error, stdout) => {
          if (error) return resolve(false);
          // 解析提取所有运行中的exe文件名
          const runningProcesses = stdout.split('\r\n')
            .map(line => line.split(',')[0]?.replaceAll('"', ''))
            .filter(Boolean);
          resolve(runningProcesses.includes(targetExeName));
        });
      });
    });
    

    渲染层React代码调用示例:

    import { useEffect, useState } from 'react';
    const { ipcRenderer } = window.require('electron');
    
    function App() {
      const [notepadRunning, setNotepadRunning] = useState(false);
    
      useEffect(() => {
        // 每2秒检测一次记事本运行状态
        const timer = setInterval(async () => {
          const status = await ipcRenderer.invoke('check-app-running', 'notepad.exe');
          setNotepadRunning(status);
        }, 2000);
        return () => clearInterval(timer);
      }, []);
    
      return <div>记事本当前运行状态:{notepadRunning ? '运行中' : '未启动'}</div>
    }
    

    注意:正式环境建议通过contextBridge做API隔离,不要直接在渲染进程开启nodeIntegration,避免XSS风险。

  • 第三方库简化实现
    可以引入systeminformation这类封装好的系统信息库,不需要自己解析命令输出,跨平台兼容性更好,安装依赖后直接调用进程查询接口即可:

    // 安装依赖:npm install systeminformation
    const si = require('systeminformation');
    async function checkAppRunning(targetExe) {
      const processData = await si.processes();
      return processData.list.some(item => item.name === targetExe);
    }
    

场景2:React应用为纯浏览器端运行的Web应用

这种场景下必须搭配本地运行的辅助组件才能突破浏览器沙箱限制,常见实现方式有两种:

  • 本地轻量服务方案:开发一个极小的本地后台程序(可以用Node.js、Go、Rust编写,打包后体积通常几MB),开机静默在后台运行,监听127.0.0.1的本地端口,提供进程查询的HTTP接口,React应用直接请求该本地接口即可拿到指定应用的运行状态,注意需要给接口配置CORS规则允许你的站点域名访问。
  • 浏览器扩展方案:开发对应浏览器的扩展程序,通过Chrome/Edge提供的Native Messaging能力对接本地原生消息宿主程序查询进程状态,扩展再将状态传递给页面内的React代码,这种方案不需要占用本地端口,但是需要用户额外安装浏览器扩展和本地宿主组件,部署流程更复杂。

所有涉及查询用户本地进程的方案,都需要明确告知用户当前操作的权限用途,符合个人信息保护相关的合规要求,禁止未经用户许可私自采集进程信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:21:31