0

Ruby の ScriptingBridge を使用して、OS X で実行中のプロセスのリストを取得しようとしています。

プロセス ID の取得を除いて、すべて正常に動作します。問題は、SystemEvents.process.id セレクターではなく、Ruby の内部 Object#id プロパティが呼び出されることです。

これは私の現在のサンプルコードです:

#!/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 ...]

Object#id ではなく、ScriptingBridge が呼び出されていることを確認するにはどうすればよいですか?

4

1 に答える 1

0
  1. Scripting Bridge には欠陥があり、多くの場合、アプリケーションの非互換性やその他の問題が発生しやすくなっています。代わりに AppleScript を (直接、または NSAppleScript、osascript、または AppleScriptObjC を介して) 使用することを検討してください。

  2. Cocoa やその他のシステム API を使用して System Events.app から情報を取得している場合、それは間違っています。SE は、これらの同じ API の単なる AppleScript ラッパーです。この場合、NSWorkspace を使用します。

    #!/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
    
于 2013-05-17T17:14:01.457 に答える