以编程方式在 OS X 中获取 运行 应用程序包
Programmatically get running application bundles in OS X
我正在尝试获取所有 运行 应用程序包的列表。用户启动的 GUI 应用程序,如显示的 Dock,或 Activity 监视器(它在某些进程旁边显示一个图标)。我发现我可以使用 sysctl()
和 KERN_PROC_ALL
来获取所有 运行 进程的列表,但这不会告诉我它们来自哪个应用程序包。像 Minecraft 这样的应用程序只是显示为 java
,这不是很有用。
我确实发现activitymonitor中的进程组名大致显示了我想知道的内容:
(来源:gdries.nl)
实现语言并不重要。目前在 C 中工作并继续,但如果需要其他一些环境,那不是问题。我想要做的就是检测用户有哪些应用程序 运行,这样我就可以记录每个应用程序的使用时间。 (家长控制做了类似的事情,但将其记录在我无法解析的 plist 文件中)
我找到了一种使用 Swift 和 Cocoa API 的方法。据推测,这也应该可以使用纯 C,但这对我的应用程序来说已经足够了。
import Foundation
import AppKit
// Get all running applications
let workspace = NSWorkspace.shared
let applications = workspace.runningApplications
for app in applications {
print(app)
}
app
是一个 NSApplication
对象,它有一个包标识符,这正是我想知道的。
我正在尝试获取所有 运行 应用程序包的列表。用户启动的 GUI 应用程序,如显示的 Dock,或 Activity 监视器(它在某些进程旁边显示一个图标)。我发现我可以使用 sysctl()
和 KERN_PROC_ALL
来获取所有 运行 进程的列表,但这不会告诉我它们来自哪个应用程序包。像 Minecraft 这样的应用程序只是显示为 java
,这不是很有用。
我确实发现activitymonitor中的进程组名大致显示了我想知道的内容:
(来源:gdries.nl)
实现语言并不重要。目前在 C 中工作并继续,但如果需要其他一些环境,那不是问题。我想要做的就是检测用户有哪些应用程序 运行,这样我就可以记录每个应用程序的使用时间。 (家长控制做了类似的事情,但将其记录在我无法解析的 plist 文件中)
我找到了一种使用 Swift 和 Cocoa API 的方法。据推测,这也应该可以使用纯 C,但这对我的应用程序来说已经足够了。
import Foundation
import AppKit
// Get all running applications
let workspace = NSWorkspace.shared
let applications = workspace.runningApplications
for app in applications {
print(app)
}
app
是一个 NSApplication
对象,它有一个包标识符,这正是我想知道的。