2016-11-16 1 views
1

Нужен способ программно определить, является ли процесс оконным процессом с использованием идентификатора процесса. Это должно работать как для пользовательских, так и для системных процессов.Учитывая идентификатор процесса, определите, является ли процесс процессом оконным на Mac

С помощью грубого метода, приведенного ниже, можно определить, окончен ли процесс пользователя. Однако у этого есть главный недостаток, он будет работать только для пользовательских процессов, а не для системы.

- (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

будут перечислены все процессы, но я не могу immediatgely видеть способ определить, является ли это оконном процесс.

Процесс, указанный указанным выше методом, имеет флаги (i.e. process->kp_proc.p_flags), но я не вижу никаких флагов: https://opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/proc.h, которые могут указывать на него как оконный процесс.

+0

Пожалуйста, покажите ваши усилия исследования/отладки до сих пор. Сначала прочитайте страницу [Ask]. –

+0

Добавлено несколько деталей. – user3564870

ответ

0

Вот как можно определить, если процесс имеет окно:

Метод UiProcesses() создаст массив processIDs для процессов с окнами.

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?

Смежные вопросы