我正在尝试通过Ruby的ScriptingBridge获取OS X上正在运行的进程列表。
除了获取进程ID之外,一切正常。问题似乎是调用Ruby的内部Object#id属性而不是SystemEvents.process.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 ...]
如何确保调用ScriptingBridge,而不是Object#id?
答案 0 :(得分:0)
脚本桥存在缺陷,通常容易出现应用程序不兼容和其他问题。请考虑使用AppleScript(直接或通过NSAppleScript,osascript或AppleScriptObjC)。
如果您正在使用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