2012-03-11 11 views
4

지정된 응용 프로그램으로 파일을 시작하고 시작한 프로그램을 즉시 맨 앞쪽 창으로 만들고 싶습니다.최근에 시작한 응용 프로그램의 PID를 가져 오는 가장 간단한 방법

NSRunningApplication* app = [NSRunningApplication 
          runningApplicationWithProcessIdentifier: PID]; 
[app activateWithOptions: NSApplicationActivateAllWindows]; 
:

[[NSWorkspace sharedWorkspace] openFile:fileName withApplication:appName]; 

을 그리고 난 그 시작 응용 프로그램의 PID를 얻을 수 있다면, 나는 그 맨 앞에 해당 응용 프로그램을 만들기 위해이 작업을 수행 할 수 :

나는 다음과 같이 나는이 작업을 수행 할 수 있다는 것을 알고

내가 가진 질문은 다음과 같습니다. 시작한 직후에이 응용 프로그램의 PID를 가져 오는 가장 간단하고 신속하며 가장 신뢰할 수있는 방법은 무엇입니까? 그래서이 응용 프로그램이 최전선인지 확인할 수 있습니까?

이것은 처음 보이는 것처럼 간단하지 않습니다. 예를 들어 Carbon 호출을 사용하여 PID를 얻거나 NSRunningApplication을 통해 액세스 할 수있는 응용 프로그램 사전을 통해 프로세스 이름이 필요합니다. 그러나 일반적으로 프로세스 이름이 무엇인지는 알 수 없으며 경우에 따라 프로세스 이름이 빈 문자열입니다.

또한이 동일한 응용 프로그램의 다른 인스턴스가 이미 실행 중일 수 있으며 방금 시작한 응용 프로그램의 특정 인스턴스의 PID를 항상 가져 오려고합니다.

누구나 현재 출시 된 응용 프로그램의 PID를 얻을 수있는 확실하고 확실한 방법을 제안 할 수 있습니까?

또는 지정된 응용 프로그램과 함께 지정된 파일을 실행하여 응용 프로그램이 항상 최전선 응용 프로그램으로 열리는 방법이 있습니까?

+0

시작한 앱 하지만 여전히 동일한 문제가 있습니다. 앱의 'ProcessSerialNumber'를 검색하기 위해 프로세스 이름이 필요하기 때문에 앱의 PID를 가져 오는 방법에 대해 위에서 설명한 것과 동일한 경쟁 조건이 존재합니다. – HippoMan

답변

1

openfile의 다른 버전을 사용해 보았습니까? 응용 프로그램을 비활성화 할 수있게되어 새로운 응용 프로그램에 집중할 수 있습니까?

[[NSWorkspace sharedWorkspace] openFile:fileName withApplication:appName andDeactivate:YES]; 
+0

고맙습니다. 예, 나는 그것을 시도했지만 항상 새로 시작된 응용 프로그램을 최전선의 응용 프로그램으로 생각하지는 않습니다. 모든 경우에 이것이 발생하도록하기 위해'SetFrontProcess (& psn)'또는 이와 동등한 함수를 호출 할 필요가있는 것처럼 보입니다. – HippoMan

1

확실히 응용 프로그램의 PID를 얻는 것은 쉽지 않습니다. 그리고 그것이 바로 Apple이 좋아하는 방식입니다. 그 건 방진 놈들.

필자가 알고있는 앱의 전체 경로에서 PID를 얻으려면이 짐승을 써야했습니다. ps aux을 파싱하는 것보다 쉽습니다!

죄송합니다. 내 개인적인 기능이 있으면 죄송합니다.하지만 내가 어떻게 돌아 갔는지, 그리고 그 길을 피하려고 노력한 것의 아이디어를 얻을 수 있습니다.

+ (NSUInteger)pidFromAppPath:(NSString*)path 
{ 
    NSRunningApplication *n = [[[NSWorkspace sharedWorkspace]runningApplications] filterOne:^BOOL(NSRunningApplication *runner) { 
     // optional: avoid totally faceless apps and "Desk Accesory"-type background apps. 
     if (runner.activationPolicy == NSApplicationActivationPolicyProhibited) || 
      runner.activationPolicy == NSApplicationActivationPolicyAccessory) 
      return nil; 
     id runPath = [runner valueForKeyPath:@"bundleURL"]; 
     NSString *runString = [runPath isKindOfClass:[NSString class]] 
          ? runPath 
          : [runPath isKindOfClass:NSURL.class] ? [((NSURL*)runPath) path] 
          : nil; 
    // optional: filter out Google Chrome's mockery of a once sane process-table 
    if (!runString 
      || [[runString lastPathComponent]contains:@"Google Chrome Helper.app"]  
      || [[runString lastPathComponent]contains:@"Google Chrome Worker.app"]  
      || [[runString lastPathComponent]contains:@"Google Chrome Renderer.app"]) 
    return nil; 
    return [runString isEqualToString:path] ?: nil; // This is where you actually test to see if it's the same as the string passed in, lol. 
    }]; 
    return n ? [n processIdentifier] : 11000; // if 11000 you messed up. 
} 

봐라 ... NSLOG: Pid of /Applications/Utilities/Terminal.app is 46152

지금 내 응용 프로그램의 맨 앞을 만들 수있는 더 신뢰할 수있는 방법은 "PSN"는의`ProcessSerialNumber`입니다 SetFrontProcess (PSN)`,`경유 실현
관련 문제