Как я могу узнать PID процесса SystemUIServer в C / C ++ / Objective-C в Mac OS?

0

Мне нужно узнать pid процесса SystemUIServer в Mac OS, чтобы передать его AXUIElementCreateApplication (pid);

На оболочке это легко возможно через ps, но как я могу это сделать в C/C++ или Objective-C?

  • 0
    Посмотрите на fork и execv для запуска ps в вашем приложении, системный вызов fork () и функцию execv
  • 0
    Хорошо, это будет обходной путь ... но не возможно ли это через системный вызов?
Показать ещё 1 комментарий
Теги:
macos
pid

2 ответа

1

Я проверил бы все запущенные процессы.

pid_t resultPid = -1;
NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];
for (NSRunningApplication *app in runningApplications) {
    pid_t pid = [app processIdentifier];
    if (pid != ((pid_t)-1)) {
        AXUIElementRef appl = AXUIElementCreateApplication(pid);
        id result = nil;
        if(AXUIElementCopyAttributeValue(appl, (CFStringRef)NSAccessibilityTitleAttribute, (void *)&result) == kAXErrorSuccess) {
            if([((NSString*)result) isEqualToString:@"SystemUIServer"]){
                resultPid = pid;
                break;
            }      
        }
    }
}

Вы также можете использовать UIElementUtilities от Apple (он помогает управлять экземплярами AXUIElementRef), чтобы получить имя процесса.

  • 0
    Привет, Судо, большое спасибо за ваш вклад. Я не работал на меня из коробки, но дал мне достаточно, чтобы найти решение (см. Ответ ниже).
0

Благодаря Sudo, Yahoo и Google я нашел следующее решение:

#include <libproc.h>

int getPid(const char* processname)
{
  pid_t resultPid = -1;
  NSArray *runningApplications = [[NSWorkspace sharedWorkspace] runningApplications];

  for (NSRunningApplication *app in runningApplications) {
    pid_t pid = [app processIdentifier];
    if (pid != ((pid_t)-1)) {

      char nameBuffer[512];
      proc_name(pid, nameBuffer, sizeof(nameBuffer));

      if(!strcmp(processname,nameBuffer)) {
         resultPid=pid;
         break;
      }
    }
  }

  return resultPid;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню