如何识别用户界面进程中的进程?

时间:2011-09-25 13:11:21

标签: objective-c macos unix process macos-carbon

如何从进程中获取信息,即UI(用户界面)进程或非ui?

使用UI流程我的意思是,Finder,Dock,系统UI服务器或任何其他具有UI界面的mac应用程序,它由Window Server使用。

我想从ProcessID确定此信息。

我正在使用mac os x。

3 个答案:

答案 0 :(得分:2)

无法确定纯粹基于PID 数字的具体流程。原因是:在启动时从PID = 1顺序(有些)分配进程ID,并且不同系统的启动可能不同。例如,如果Finder或Dock崩溃并且必须重新启动,则还将重新分配进程ID。

如果您可以运行具有特定pid的终端命令,请执行以下操作:

ps -p <pid> -o ucomm=

您将获得进程的文件名,您可以根据您知道的UI进程列表进行检查。例如,以下是我系统上用于当前登录会话的某些ps命令的输出:

> ps -p 110 -o ucomm=
Dock

> ps -p 112 -o ucomm=
Finder

以下命令将按进程ID的顺序为您提供进程列表,只有名称:

> ps -ax -o pid=,ucomm=
   1 launchd
  10 kextd
  11 DirectoryService
     ...

编辑:你可以做你所要求的,虽然它很复杂。 This回答提到:

  

来自CGWindow.h的函数CGWindowListCopyWindowInfo()将返回一个字典数组,每个窗口对应一个与您设置的条件相匹配的字典,包括其他应用程序中的条件。它只允许您通过给定窗口上方的窗口,给定窗口下方的窗口和“屏幕”窗口进行过滤,但返回的字典包含拥有应用程序的进程ID,您可以使用该进程ID将窗口与应用程序匹配。

如果您可以获取所有CGWindow及其各自的pid,那么您将了解所有UI应用程序的pid,而无需在ps处运行CFArrayRef UiProcesses() { CFArrayRef orderedwindows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID); CFIndex count = CFArrayGetCount (orderedwindows); CFMutableArrayRef uiProcess = CFArrayCreateMutable (kCFAllocatorDefault , count, &kCFTypeArrayCallBacks); for (CFIndex i = 0; i < count; i++) { if (orderedwindows) { CFDictionaryRef windowsdescription = (CFDictionaryRef)CFArrayGetValueAtIndex(orderedwindows, i); CFNumberRef windowownerpid = (CFNumberRef)CFDictionaryGetValue (windowsdescription, CFSTR("kCGWindowOwnerPID")); CFArrayAppendValue (uiProcess, windowownerpid); } } return uiProcess; } 所有

Rahul已经为这种方法实现了以下代码,他要求我添加我的答案:

{{1}}

答案 1 :(得分:0)

请尝试以下操作。

#include <unistd.h>

  if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO))
    // Process associated with a terminal
  else
    // No terminal - probably UI process

答案 2 :(得分:0)

在darvidsOn的行中,下面是你问题的答案。

  CFArrayRef UiProcesses()
    {
        CFArrayRef  orderedwindows = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID);
        CFIndex count = CFArrayGetCount (orderedwindows);
        CFMutableArrayRef uiProcess = CFArrayCreateMutable (kCFAllocatorDefault , count,  &kCFTypeArrayCallBacks);
        for (CFIndex i = 0; i < count; i++)
        {
            if (orderedwindows)
            {
                CFDictionaryRef windowsdescription = (CFDictionaryRef)CFArrayGetValueAtIndex(orderedwindows, i);
                CFNumberRef windowownerpid  = (CFNumberRef)CFDictionaryGetValue (windowsdescription, CFSTR("kCGWindowOwnerPID"));
                CFArrayAppendValue (uiProcess, windowownerpid);

            }
        }
        return uiProcess;
    }

只需将您拥有的processid与数组项进行比较即可获得所需的结果。