2016-11-15 77 views
0

我正在寻找一种方式来获得在Mac上所有运行的进程,满足以下要求:编程让所有正在运行的进程列表在Mac

1)所有进程(系统和用户)

2.)给定供应商流程的唯一流程名称。例如,来自两个供应商的应用程序可能具有相同的进程名称(如Activity Monitor中所示)。用下面的代码,bundleIdentifier会给出一个唯一的名字。活动监视器可能会显示具有相同进程名称的多个进程,但该进程名称对于该进程是唯一的。

3.)如果过程具有窗口

下面的代码将执行图2和3,但不为1(它只是变得用户的进程)。

for (NSRunningApplication app in [[NSWorkspace sharedWorkspace] runningApplications]) { 
    NSString *uniqueName = app.bundleIdentifier; 
    BOOL hasWindow = (app.activationPolicy == NSApplicationActivationPolicyRegular)?YES:NO; 
} 

有没有人知道另一种方式来满足所有3个要求?

+0

你能详细说明你需要#2吗?该系统例如启动mdworker等多个进程并行工作,因此这实际上是不可能的。但是,根据你实际要做的事情,可能存在对你来说“足够独特”的标识符。例如。如果您只是想在运行时跟踪进程,则可以使用PID,但这是随机的,只在运行时才有效。路径可以改变(即使在一个进程正在运行时),但对某些使用情况可能足够好... – uliwitness

+0

如果您需要在Mac上查找所有窗口(针对当前用户),请查看CGWindowList。 ISTR他们可以为您提供每个窗口的PID,您可以使用它们将它们与从别处获得的过程列表相关联。我认为他们甚至包括一个你可以向用户展示的进程名(但是没有一个足够用于#2)。 – uliwitness

回答

0

请从Darwin Sources档案库中将ps的源代码(它将被隐藏在系统工具档案之一中,而不是它自己的)中并从那里开始。

这会让你(1)。 (2)是不可能的;两个进程可以具有相同的名称(但每个进程必须具有唯一的PID--使用该进程)。

(3)您必须以某种方式去掠夺窗口服务器。我想可能是GitHub上有关于如何做到这一点的片段。

+0

我会换个#2。需要一种方法来区分不同供应商的两个进程名称。 – user3564870

相关问题