如何使用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
相关产品推荐
相关产品推荐

