C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – 如何从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.当被要求打开文件时,找到真实来源(应用程序)的可靠方法是什么?由于这是一个事件,它必须有一个来源;我不想跟踪最近活动的应用程序,可能是发件人.

解决方法

大佬总结

以上是大佬教程为你收集整理的objective-c – 如何从Apple事件中获取源应用程序?全部内容,希望文章能够帮你解决objective-c – 如何从Apple事件中获取源应用程序?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。