给定进程 ID,确定进程是否是 Mac 上的窗口进程
Given a Process ID, determine if the process is a windowed process on a Mac
需要一种使用进程 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 可能表明它是一个窗口化进程。
以下是确定进程是否具有 window:
的方法
UiProcesses() 方法将为 windows 的进程创建一个进程 ID 数组。
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?
需要一种使用进程 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 可能表明它是一个窗口化进程。
以下是确定进程是否具有 window:
的方法UiProcesses() 方法将为 windows 的进程创建一个进程 ID 数组。
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?