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

基于Electron+Node.js开发桌面监控应用:跨平台识别带UI进程问询

跨平台获取带UI的桌面进程(Electron/Node.js实现)

分平台原生解决方案

不同桌面系统的窗口管理逻辑差异极大,没有统一的跨平台API,得针对Windows、macOS、Linux分别处理:

Windows

  • 调用原生API:借助ffi-napi或win32-api这类Node.js库,调用EnumWindows遍历所有顶层窗口,用IsWindowVisible过滤隐藏窗口,通过GetWindowThreadProcessId获取窗口对应的PID,最后用GetModuleFileNameEx拿到进程可执行文件路径,解析出应用名称。
  • 简易命令方案:用Node.js的child_process执行系统命令 tasklist /v /fi "STATUS eq running",过滤出Window Title列非空的进程,这些就是带UI的应用。

macOS

  • 最可靠的方式是用AppleScript:安装node-osascript库,执行脚本 tell application "System Events" to get name and unix id of every process whose visible is true,直接返回所有可见(带UI)进程的名称和PID。
  • 命令行备选:执行 ps aux | grep -E "(.*\.app)" | grep -v grep 筛选,但精度不如AppleScript——有些后台进程也带.app后缀。

Linux(X11/Wayland)

  • X11环境:用xwininfo、xprop命令或x11 Node.js库。先执行 xwininfo -root -children 获取所有窗口ID,再用 xprop -id <窗口ID> _NET_WM_PID 拿到PID,_NET_WM_NAME 获取窗口名称,过滤掉无名称的系统窗口即可。
  • Wayland环境:没有通用跨桌面接口,仅部分桌面环境有适配方案。比如GNOME可执行 gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval 'global.get_window_actors().map(a => a.meta_window.get_wm_class() + " " + a.meta_window.get_pid())',但换桌面环境可能失效。

备选方案:OpenCV图像识别

如果原生方案无法满足需求,用OpenCV识别活跃顶层窗口的思路如下:

  • 先用Electron的desktopCapturer捕获屏幕截图
  • 借助OpenCV的模板匹配,或结合Tesseract OCR识别窗口标题栏的应用名称;也可通过窗口边框特征定位顶层窗口
  • 注意:这种方法精度受屏幕分辨率、窗口样式影响大,且无法直接获取PID,需和进程列表做关联匹配,仅适合识别当前活跃窗口的场景。

实现小贴士

  1. 优先采用原生方案,稳定性和准确性远高于图像识别
  2. 在Electron中通过process.platform判断当前系统,加载对应平台的处理逻辑即可
  3. 实现应用管控时,拿到PID后,Windows用taskkill、macOS/Linux用kill命令,通过Node.js的child_process调用就能完成进程终止或管控

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:20:24