Как получить PID из ProcessSerialNum в OSX 10.9?
GetProcessPID
был отмечен как устаревший в OSX 10.9 вместе с примечанием:
Используйте свойство processIdentifier соответствующего объекта NSRunningApplication.
Проблема заключается в создании методов класса для NSRunningApplication
нет способа получить NSRunningApplication
по ProcessSerialNum
, только по PID или имени пакета.
Имя пакета слишком двусмысленное (может быть несколько экземпляров), и у меня нет PID (это то, что я хочу).
В OSX 10.9 есть ли способ получить PID при наличии PSN?
2 ответа
Соблюдайте 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];
Если вы используете метод runningApplicationsWithBundleIdentifier
класса NSRunningApplication
, вы получите NSArray NSRunningApplication. Затем вы можете прочитать свойства этих объектов (URL-адрес пакета, локализованное имя…), чтобы идентифицировать интересующий вас объект, и, наконец, получить его PID.