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

如何使用Electron.js获取桌面所有已打开应用列表而非进程列表

问题根因

你使用的tasklist、ps-list、ps-node这类工具本质是获取系统全量进程,Windows 10的进程包含系统服务、后台驻留程序、用户可见桌面应用等多种类型,没有做窗口可见性过滤的前提下,无法直接筛选出用户正在使用的桌面应用列表。

实现方案

核心逻辑

要拿到准确的桌面运行应用列表,核心是筛选出对应顶层窗口可见、且在任务栏有显示的进程,而非单纯过滤进程属性。

具体实现方式

方式1:调用Win32原生API(推荐,准确率最高)

你可以直接使用封装好的Windows窗口操作npm包,不用自己封装原生接口,示例依赖winctl,使用代码如下:

const winctl = require('winctl');

// 遍历所有顶层窗口
const allTopWindows = winctl.GetWindows();
const runningDesktopApps = [];

allTopWindows.forEach(win => {
  const winTitle = win.getTitle();
  const winClassName = win.getClassName();
  // 过滤规则:窗口标题非空,排除系统内置的桌面、任务栏等后台窗口
  if (winTitle && !['Shell_TrayWnd', 'Progman', 'WorkerW'].includes(winClassName)) {
    runningDesktopApps.push({
      进程ID: win.getPid(),
      窗口标题: winTitle,
      进程路径: win.getProcessPath(),
      进程名: win.getProcessName()
    });
  }
});

console.log('当前运行的桌面应用:', runningDesktopApps);

使用注意:

  • 安装依赖后需要执行electron-rebuild适配当前Electron版本,避免原生模块版本不兼容
  • 若需要识别UWP应用,可额外调用win.getAppUserModelId()接口匹配对应UWP进程标识

方式2:基于现有进程列表二次过滤

如果不想引入原生依赖,可对已拿到的全量进程做规则过滤,准确率略低于原生方案:

  • 排除路径为C:\Windows\、C:\Program Files\WindowsApps下的系统进程/ UWP后台进程
  • 排除系统通用后台进程名:svchost.exe、csrss.exe、winlogon.exe、lsass.exe、smss.exe等
  • 剩余进程基本为用户启动的桌面应用,可根据业务场景补充过滤规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:04