【问题标题】:How to get the PID from a ProcessSerialNum in OSX 10.9?如何从 OSX 10.9 中的 ProcessSerialNum 获取 PID?
【发布时间】:2014-04-24 13:27:22
【问题描述】:

GetProcessPID 在 OSX 10.9 中被标记为已弃用,并附有注释:

使用适当的 processIdentifier 属性 NSRunningApplication 对象。

问题是NSRunningApplication 的构造类方法无法通过ProcessSerialNum 获取NSRunningApplication,只能通过PID 或包名称。

捆绑包名称太模糊(可能有多个实例)并且我没有 PID(这是我想要的)。

在 OSX 10.9 中,有没有办法在您拥有 PSN 时获取 PID?

【问题讨论】:

  • 我认为一般的方法是从提供 PSN 的任何 API 切换到现代 API。那么,您首先如何获得 PSN?
  • 我正在从系统进程内存中提取它们。它只包含 PSN。
  • 这引发了你为什么要这样做的问题。如果您在高层次上解释您要完成的工作,也许有一个解决方案不涉及在系统进程的内存中四处寻找(!?!)。
  • 我想要 Dock 显示每个图标的 UILayer 以及将其与进程关联的能力。因为这个应用程序明显违反了未发布的 API,所以使用未发布的 API 将 PSN 解析为 PID 是没有问题的。这在很大程度上是一个好奇的问题,因为苹果似乎过早地放弃了很多 API。
  • 我认为人们通常使用 Accessibility API 来查找停靠图标窗口的位置。

标签: objective-c macos pid nsrunningapplication


【解决方案1】:

注意NSWorkspaceDidLaunchApplicationNotification 通知。

在回调中,获取进程序号如下:

NSDictionary* dictionary = [notification userInfo];
NSNumber* psnLow = [dictionary valueForKey: @"NSApplicationProcessSerialNumberLow"];
NSNumber* psnHigh = [dictionary valueForKey: @"NSApplicationProcessSerialNumberHigh"];
ProcessSerialNumber psn;
psn.highLongOfPSN = [psnHigh intValue];
psn.lowLongOfPSN = [psnLow intValue];
NSRunningApplication *newApplication = [dictionary valueForKey:NSWorkspaceApplicationKey];

source

【讨论】:

  • 但我的应用程序在这些其他应用程序启动后启动。
  • 无法理解!您的应用程序在这些通知发送后启动?或者您希望 ProcessSerialNumber 用于其他应用程序?
  • 我想要其他应用程序的 ProcessSerialNumber :)
  • 您能否详细说明您通过ProcessSerialNumber 实现的目标?
【解决方案2】:

如果你使用NSRunningApplication类的方法runningApplicationsWithBundleIdentifier,你会得到一个NSRunningApplication的NSArray。 然后,您可以读取这些对象的属性(捆绑 URL、本地化名称……)来识别您感兴趣的对象,最后得到它的 PID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2013-11-30
    • 2015-08-21
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多