我正在尝试访问一个进程,以便稍后使用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“没有符合指定进程序列号的符合条件的进程”。
我测试了一些进程并且此代码有效,但不能与其他进程一起使用。我的流程之间没有非常明显的区别可以
非常感谢您的任何建议。
答案 0 :(得分:1)
并非每个流程都有流程序列号,只有应用程序。 GetProcessForPID
的文档未能说明,但请参阅技术问答&答QA1123。
编辑添加:这是该文档的引用...
问:如何获取Mac OS X上所有进程的列表?
答:嗯,这取决于你如何定义“过程”。如果要列出所有正在运行的应用程序,则应使用Carbon Process Manager例程GetNextProcess。这将返回所有应用程序进程的列表,包括在Carbon,Cocoa和Classic环境中运行的进程。但是,这不会返回非应用程序(守护程序)进程的列表。
答案 1 :(得分:0)
您能举例说明哪些流程名称有效且无效?进程的名称是任意的,可能与应用程序的可读名称不匹配。例如,Time Machine在后台运行为“backupd
”。
如果你告诉我们你想要完成的是什么,我们或许可以建议另一种方法来实现它。