Как я могу получить исходное приложение от Apple Event? - PullRequest
7 голосов
/ 18 октября 2010

Когда другое приложение запрашивает мое приложение об открытии файлов, мне нужно выяснить, какое приложение является источником, потому что предпринимаются разные действия.В

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

1 Ответ

4 голосов
/ 06 декабря 2013
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...