2013-05-16 3 views
0

Ruby의 ScriptingBridge를 통해 OS X에서 실행중인 프로세스 목록을 얻으려고합니다.Ruby ScriptingBridge를 통해 "id"선택기에 액세스하는 방법

프로세스 ID를받는 것 외에는 모두 잘 작동합니다. 문제는 Ruby의 내부 Object # id 속성이 SystemEvents.process.id selector 대신 호출된다는 것입니다.

이 내 현재 샘플 코드입니다 :

#!/usr/bin/env ruby 

# Lists all active processes 

require 'osx/cocoa' 
include OSX 
OSX.require_framework 'ScriptingBridge' 

app = SBApplication.applicationWithBundleIdentifier_("com.apple.SystemEvents") 
procs = app.processes 

procs.each do |x| 
    puts "Process No. #{x.id}: #{x.name}" 
end 

이 (의 일부)는 출력입니다입니다 :

merlin:mw ~/> /Users/mw/Projekte/Ruby/winlist.rb 
/Users/mw/Projekte/Python/winlist.rb:13: warning: Object#id will be deprecated; use Object#object_id 
Process No. 2275604960: loginwindow 
/Users/mw/Projekte/Python/winlist.rb:13: warning: Object#id will be deprecated; use Object#object_id 
Process No. 2275603460: talagent 
/Users/mw/Projekte/Python/winlist.rb:13: warning: Object#id will be deprecated; use Object#object_id 
Process No. 2275600720: Dock 
[... snipped list of all my processes ...] 

가 어떻게이 ScriptingBridge가 호출되어 있는지 확인 할 수 없습니다 # ID를 객체?

+0

이 경우, NSWorkspace를 사용할 수 있습니까? 'Object # id'는 Ruby 1.9에서 더 이상 존재하지 않습니다. – steenslag

+0

좀 더 일반적인 해결책을 찾고 있었지만, 아마 하나가 아니기 때문에, 나는 그것을 분명히 시도 할 것입니다. 잠시 후에 파이썬으로 넘어갔습니다 :-) –

답변

0
  1. 스크립팅 브리지에 결함이있어 종종 응용 프로그램과의 비 호환성 및 기타 문제가 발생하기 쉽습니다. AppleScript (직접 또는 NSAppleScript, osascript 또는 AppleScriptObjC를 통해)를 대신 사용해보십시오.

  2. System Events.app에서 정보를 얻기 위해 Cocoa 나 다른 시스템 API를 사용하고 있다면 잘못하고있는 것입니다. SE는 동일한 API를 둘러싼 AppleScript 래퍼입니다. 어쩌면 업그레이드

    #!/usr/bin/env ruby 
    
    # Lists all active processes 
    
    require 'osx/cocoa' 
    include OSX 
    
    procs = NSWorkspace.sharedWorkspace.runningApplications 
    
    procs.each do |x| 
        puts "Process No. #{x.processIdentifier} Name. #{x.localizedName}" 
    end 
    
+0

그래, NSRunningApplication에 필 요한'windows' 속성이없는 것 같아서 이건별로 도움이되지 않습니다. 나는 그것을 다른 방법으로 해결했기 때문에 대답으로 표시 할 것입니다. –