Как мне получить исходное приложение из события 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 или что-то еще, что могло бы быть полезно для меня.

Итак, мои вопросы были бы такими:
потому что предпринимаются разные действия. В

- (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 или что-то еще, что могло бы быть полезно для меня.

Итак, мои вопросы были бы такими:
потому что предпринимаются разные действия. В

- (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 или что-то еще, что могло бы быть полезно для меня.

Итак, мои вопросы были бы такими:
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 или что-то еще, что могло бы быть полезно для меня.

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

7
задан w-m 18 October 2010 в 15:29
поделиться