某些进程的GetProcessForPID错误-600

时间:2011-12-26 21:57:47

标签: macos-carbon

我正在尝试访问一个进程,以便稍后使用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作为整数获取,这似乎正常工作。但是我在GetPIDForProcessName状态中收到错误600“没有符合指定进程序列号的符合条件的进程”。

我测试了一些进程并且此代码有效,但不能与其他进程一起使用。我的流程之间没有非常明显的区别可以

非常感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

并非每个流程都有流程序列号,只有应用程序。 GetProcessForPID的文档未能说明,但请参阅技术问答&答QA1123。

编辑添加:这是该文档的引用...

  

问:如何获取Mac OS X上所有进程的列表?

     

答:嗯,这取决于你如何定义“过程”。如果要列出所有正在运行的应用程序,则应使用Carbon Process Manager例程GetNextProcess。这将返回所有应用程序进程的列表,包括在Carbon,Cocoa和Classic环境中运行的进程。但是,这不会返回非应用程序(守护程序)进程的列表。

答案 1 :(得分:0)

您能举例说明哪些流程名称有效且无效?进程的名称是任意的,可能与应用程序的可读名称不匹配。例如,Time Machine在后台运行为“backupd”。

如果你告诉我们你想要完成的是什么,我们或许可以建议另一种方法来实现它。