如何从Apple事件获取源应用程序?

当另一个应用程序要求我的应用程序打开文件时,我需要找出哪个应用程序是源,因为采取了不同的操作过程。 在

- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames

该代码目前是:

NSAppleEventDescriptor *currentEvent = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSAppleEventDescriptor *addrDesc = [currentEvent attributeDescriptorForKeyword:keyAddressAttr];
NSData *psnData = [[addrDesc coerceToDescriptorType:typeProcessSerialNumber] data];
const ProcessSerialNumber * PSN = [psnData bytes];
NSDictionary * info = nil;
// Same process check
ProcessSerialNumber currentPSN;
GetCurrentProcess(&currentPSN);
Boolean samePSN = FALSE;
if(PSN && noErr == SameProcess(&currentPSN, PSN,  &samePSN) && !samePSN)
{
    info = [(NSDictionary *) ProcessInformationCopyDictionary(PSN, kProcessDictionaryIncludeAllInformationMask) autorelease];
}

这似乎总是工作正常。 但是现在(工作在10.6.4)我发现在某些情况下,我得到错误的PSN,有时导致信息为零,有时候它包含

BundlePath = "/System/Library/CoreServices/CoreServicesUIAgent.app";
CFBundleExecutable = "/System/Library/CoreServices/CoreServicesUIAgent.app/Contents/MacOS/CoreServicesUIAgent";
CFBundleIdentifier = "com.apple.coreservices.uiagent";
CFBundleName = CoreServicesUIAgent;
CFBundleVersion = 1093697536;
FileCreator = "????";
FileType = "????";
Flavor = 3;
IsCheckedInAttr = 1;
LSBackgroundOnly = 0;
LSSystemWillDisplayDeathNotification = 0;
LSUIElement = 1;
LSUIPresentationMode = 0;

这个系统服务显然不是我正在寻找的应用程序。 我检查了另一个属性:keyAddressAttr和keyOriginalAdressAttr是相同的。 另一件令人感兴趣的事情是keyEventSourceAttr,但我找不到任何文档 - 它返回的SInt16似乎不是一个pid或任何其他可能对我有用的东西。

所以我的问题是:
1.引用的代码有什么问题吗?
2.我在哪里可以找到有关keyEventSourceAttr的文档?
3.这里发生了什么 - 为什么这个系统服务是我的事件的来源而不是过程?
4.当被要求打开文件时,什么是可靠的方法来查找真实来源(应用程序)? 由于这是一个事件,它必须有一个来源; 我不想跟踪最近处于活动状态的应用程序,并且可能是发件人。


(从https://developer.apple.com/legacy/library/documentation/mac/pdf/Interapplication_Communication/Intro_to_Apple_Events.pdf)

关键字指定的描述符记录来自苹果事件简介

我希望这能帮到您。

链接地址: http://www.djcxy.com/p/48377.html

上一篇: How do I get the source application from an Apple Event?

下一篇: Parse JSON in JavaScript?