Brian 和 Daniel 都提供了很好的线索,帮助我找到了正确的答案,但他们建议的东西有点不对劲。这就是我最终解决问题的方法。
对于获取进程 ID 的 Apple 事件描述符而不是序列号的代码,Brian 是正确的:
// get the process id for the application that sent the current Apple Event
NSAppleEventDescriptor *appleEventDescriptor = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSAppleEventDescriptor* processSerialDescriptor = [appleEventDescriptor attributeDescriptorForKeyword:keyAddressAttr];
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID];
问题是,如果您-int32Value
从该描述符中获取值,则返回值 0(即没有进程 ID。)我不知道为什么会发生这种情况:理论上,两者pid_t
和SInt32
都是有符号整数。
相反,您需要获取字节值(以小端序存储)并将它们转换为进程 ID:
pid_t pid = *(pid_t *)[[pidDescriptor data] bytes];
从那时起,很容易获得有关正在运行的进程的信息:
NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
NSString *bundleIdentifer = [runningApplication bundleIdentifier];
此外,丹尼尔的使用建议keySenderPIDAttr
在很多情况下都行不通。在我们新的沙盒世界中,存储在那里的值可能是 的进程 ID /usr/libexec/lsboxd
,也称为启动服务沙盒守护程序,而不是发起事件的应用程序的进程 ID。
再次感谢 Brian 和 Daniel 的帮助导致了这个解决方案!