Когда другое приложение запрашивает мое приложение об открытии файлов, мне нужно выяснить, какое приложение является источником, потому что предпринимаются разные действия.В
- (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. Каков надежный способ найти реальный источник (приложение) при запросе openFiles?Поскольку это событие, оно должно иметь источник;Я не хочу отслеживать приложения, которые были активны в последнее время, и может быть отправителем.