Mac OSX如何获取与强制退出应用列表一致的应用程序清单?
在Mac OSX获取和强制退出应用列表一致的应用清单
当然可以做到!强制退出列表里的应用本质上是拥有图形界面、在前台可交互的应用程序,和后台默默运行的守护进程、命令行进程完全不同。你之前的代码返回全部进程,就是因为没做针对性的筛选。下面给你几种靠谱的实现方式:
方法一:用AppleScript快速获取(适合终端或脚本)
AppleScript可以直接和系统事件交互,精准拿到和强制退出一致的应用列表,不需要复杂的代码:
osascript -e 'tell application "System Events" to get name of every application process whose background only is false'
这个命令会返回所有非后台运行的GUI应用名称,和你打开「强制退出应用」窗口看到的内容完全匹配。
方法二:用Swift/Objective-C实现(适合Mac应用开发)
如果是在自己的Mac应用里实现,可以借助NSWorkspace类,它专门负责管理系统里的运行应用。核心是筛选出activationPolicy为.regular的应用——这个属性标记了应用是拥有标准图形界面的前台应用,正是强制退出列表里的目标:
Swift代码示例:
import Cocoa func getForceQuitApps() -> [String] { let workspace = NSWorkspace.shared // 筛选出有图形界面的前台应用 let targetApps = workspace.runningApplications.filter { $0.activationPolicy == .regular } // 提取应用名称(优先显示本地化名称,没有的话用BundleID) return targetApps.map { $0.localizedName ?? $0.bundleIdentifier ?? "未知应用" } } // 调用示例 let forceQuitApps = getForceQuitApps() print(forceQuitApps)
为什么这个筛选是对的?
Mac上的应用有三种激活策略:
.regular:标准前台应用,有独立窗口、可在Dock显示,就是强制退出列表里的应用.accessory:辅助应用,没有独立Dock图标,但有界面(比如某些菜单栏应用的弹窗).prohibited:完全后台运行的进程,没有任何图形界面,不会出现在强制退出列表里
补充说明
如果你之前用的是ps命令或者其他进程枚举方法,它们会把所有类型的进程都列出来,包括后台服务、命令行工具等。而上面的两种方法都是直接针对系统定义的「GUI前台应用」进行筛选,所以结果和强制退出列表完全一致。
内容的提问来源于stack exchange,提问作者7Brankovic




