我怎样才能得到一个过程,它是UI(用户界面)工艺或非UI信息?如何确定是否在用户界面进程的进程?
随着UI过程中,我的意思是,搜索,码头,系统UI服务器,或具有UI界面,它由Window服务器的任何其他Mac应用程序。
我要确定从该的ProcessID信息。
我使用Mac OS X的。
我怎样才能得到一个过程,它是UI(用户界面)工艺或非UI信息?如何确定是否在用户界面进程的进程?
随着UI过程中,我的意思是,搜索,码头,系统UI服务器,或具有UI界面,它由Window服务器的任何其他Mac应用程序。
我要确定从该的ProcessID信息。
我使用Mac OS X的。
没有办法纯粹基于将PID 数什么具体过程是确定。这样做的原因:进程ID分配(有点)在启动时从PID = 1顺序和启动可以是不同的系统不同。进程ID也将被如果,例如,搜索或Dock崩溃和必须重新启动重新分配。
如果你可以运行你有,但具体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
S和它们各自的pid
S,那么你就会知道pid
S的所有UI应用程序,而无需运行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;
}
尝试以下。
#include <unistd.h>
if (isatty(STDIN_FILENO) || isatty(STDOUT_FILENO) || isatty(STDERR_FILENO))
// Process associated with a terminal
else
// No terminal - probably UI process
在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以获得所需的结果。
我已更新问题。谢谢 – MacGeek
我建议用编程语言替换你的'process'标签,鉴于你的以mac为中心的问题,Objective-C似乎是合适的。许多电力用户只能扫描其专业问题。祝你好运。 – shellter
大概有一个目的是得到这个。如果你解释了你实际想要达到的目标(为什么你需要知道这一点,以及为什么从过程ID?),你可能会得到更有用的答案。 :) –