2011-12-26 33 views
1

我想訪問一個進程以後用CGEventPostToPSN發送密鑰。但我的問題是我無法獲得運行過程。我使用下面的代碼:GetProcessForPID錯誤-600與一些進程

 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「沒有指定進程序列號的合格進程」。

我測試了一些過程,並且此代碼可以正常工作,但不能與其他人一起工作。我沒有非常明顯的區別,進程可以是

非常感謝您的任何建議。

回答

1

不是每個進程都有一個進程序列號,只是應用程序。 GetProcessForPID的文檔未能說明,但請參閱技術Q & A QA1123。

編輯補充:下面是從這份文件報價...

問:我如何在Mac OS X中的所有進程的列表?

答:那麼,這取決於你如何定義「過程」。如果要列出所有正在運行的應用程序,應使用Carbon Process Manager例程GetNextProcess。這將返回所有應用程序進程的列表,包括在Carbon,Cocoa和Classic環境中運行的應用程序進程。但是,這不會返回非應用程序(守護程序)進程的列表。

+0

...如果你有它的副本。它不再是在線可用的。 (它的URL *是*:http://developer.apple.com/library/mac/qa/qa2001/qa1123.html) –

+0

@PeterHosey:我明白了,你是對的。如果我在Xcode 3.2.6中搜索文檔,我會在10.6核心庫中找到它,但是如果我在Xcode 4.2中搜索文檔,它不在那裏。 – JWWalker

+0

好的。謝謝。可能是我的選擇不是正確的方式然後 –

0

你可以給我們一些進程名稱的例子嗎?進程的名稱是任意的,可能與應用程序的人類可讀名稱不匹配。例如,Time Machine在後臺運行爲「backupd」。

如果您告訴我們您要完成的工作,我們可能會提出一種替代方法來實現它。

+0

我用我的完整代碼編輯我的問題,讓你看到我正在嘗試做什麼,如果它是正確的方式。否則,我的進程名是正確的,因爲GetPIDForProcessName返回我的進程的正確PID。我嘗試GetProcessForPID與例如「地址簿」過程,而不是錯誤。 感謝您的幫助! –

+0

例如,如果我測試此代碼與「文本編輯」進程運行正確。但是我的過程是一個通用的二進制文件,需要一些鍵盤操作。 –

+2

@ JoelP:你無法獲得PSN的過程的名稱和PID是什麼? –