Ошибка GetProcessForPID -600 с некоторым процессом - PullRequest
1 голос
/ 27 декабря 2011

Я пытаюсь получить доступ к процессу, чтобы позже отправить ключ с помощью CGEventPostToPSN. Но моя проблема в том, что я не могу запустить процесс. Я использую следующий код:

     pid_t pid = GetPIDForProcessName("myprocess");
        NSLog(@"PID: %d", pid);

        ProcessSerialNumber psn = { 0, pid };
        OSStatus status = GetProcessForPID(pid, &psn);

        if (status != noErr) {
            NSLog(@"OSStatus KO PID: %d  %d %d", status, noErr, pid);
        }else{
            NSLog(@"OSStatus OK PID: %d  %d %d", status, noErr, pid);

    CGEventRef keyDown;
    keyDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)0, TRUE);     
    CGEventRef keyUp;
    keyUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)0, FALSE);  
    CGEventPostToPSN(&psn, keyDown);
    CFRelease(keyDown);
    CGEventPostToPSN(&psn, keyUp);
    CFRelease(keyUp);
}

Я использую класс "GetPID.h", чтобы получить PID как целое число, и это, кажется, работает правильно. Но я получаю ошибку 600 «Нет допустимого процесса с указанным серийным номером процесса» в статусе GetPIDForProcessName.

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

Большое спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Не у каждого процесса есть серийный номер, только приложения. В документах по GetProcessForPID об этом не сказано, но см. Технические вопросы и ответы QA1123.

Изменить, чтобы добавить: Вот цитата из этого документа ...

В: Как получить список всех процессов в Mac OS X?

A: Ну, это зависит от того, как вы определяете «процесс». Если вы хотите перечислить все запущенные приложения, вам следует использовать подпрограмму Carbon Process Manager GetNextProcess. Это вернет список всех процессов приложения, в том числе запущенных в средах Carbon, Cocoa и Classic. Однако это не возвращает список процессов, не относящихся к приложениям (демонам).

0 голосов
/ 27 декабря 2011

Можете ли вы привести примеры имен процессов, которые работают и не работают? Имя процесса является произвольным и может не соответствовать удобочитаемому имени приложения. Например, Time Machine работает в фоновом режиме как "backupd".

Если вы сообщите нам, чего вы пытаетесь достичь, мы могли бы предложить альтернативный способ сделать это.

...