You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动