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