给定进程ID,确定该进程是否是Mac上的窗口化进程

时间:2016-11-16 07:08:40

标签: objective-c c macos process macos-sierra

需要一种方法以编程方式确定进程是否是使用进程ID的窗口化进程。这需要适用于用户和系统进程。

使用下面的粗略方法,可以确定用户进程是否被窗口化。但是,这有一个重大缺陷,它只适用于用户进程,而不适用于系统。

- (BOOL)processIsWindowed:(pid_t)processID {
    for (NSRunningApplication app in [[NSWorkspace sharedWorkspace] runningApplications]) {
        if(app.processIdentifier == processID && (app.activationPolicy == NSApplicationActivationPolicyRegular)){
            return YES;
        }
    }
    return NO;
}

使用:

static int GetBSDProcessList(kinfo_proc **procList, size_t *procCount){}

Using NSWorkspace to get all running processes

会列出所有流程,但我无法立即找到确定它是否为窗口流程的方法。

上述方法列出的进程有标记(i.e. process->kp_proc.p_flags),但我没有看到列出的任何标记:https://opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h可能表明它是一个窗口化进程。

1 个答案:

答案 0 :(得分:0)

以下是如何确定流程是否有窗口的信息:

UiProcesses()方法将为具有windows的进程创建一个processID数组。

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;
}

来源:How to Identify if the process in User Interface Process?