2011-12-26 8 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); 
} 

私は整数としてPIDを取得するには、クラス「GetPID.h」を使用していますが、これは正常に動作しているようです。しかし、GetPIDForProcessNameステータスに「指定されたプロセスシリアル番号を持つ適格プロセスがありません」というエラー600が表示されます。

私はいくつかのプロセスをテストしましたが、このコードは動作しますが、他のプロセスでは動作しません。私はプロセス間の非常に明確な違いはありません

どうかありがとうございます。

答えて

1

すべてのプロセスにプロセスシリアル番号が付いているわけではありません。 GetProcessForPIDのドキュメントはそれを言い表せませんが、テクニカルQ & QA1123を参照してください。

編集追加する:ここでは、そのドキュメントからの引用です...

Qを:どのように私は、Mac OS X上のすべてのプロセスのリストを得るのですか?

A:これは、「プロセス」の定義方法によって異なります。実行中のアプリケーションをすべて一覧表示するには、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を試してみます。たとえば、 "Address Book"プロセスで、エラーではありません。 ご協力いただきありがとうございます! –

+0

たとえば、 "TextEdit"プロセスでこのコードをテストすると、正しく実行されます。しかし、私のプロセスは、動作するためにいくつかのキーストロークを必要とするユニバーサルバイナリです。 –

+2

@JoelP .:あなたがPSNを手に入れることができないプロセスの名前とPIDは何ですか? –