当另一个应用程序要求我的应用程序打开文件时,我需要找出哪个应用程序是源,因为采取了不同的操作过程.在
- (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(¤tPSN); Boolean samePSN = FALSE; if(PSN && noErr == SameProcess(¤tPSN,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.当被要求打开文件时,找到真实来源(应用程序)的可靠方法是什么?由于这是一个事件,它必须有一个来源;我不想跟踪最近活动的应用程序,可能是发件人.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。