2010-10-18 6 views
7

Lorsqu'une autre application demande à mon application d'ouvrir des fichiers, j'ai besoin de savoir quelle application est la source, car différentes actions sont prises. DansComment obtenir l'application source d'un événement Apple?

- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames 

le code est actuellement:

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]; 
} 

Ce semblait toujours fonctionner correctement. Mais maintenant (travail sur 10.6.4) J'ai découvert que dans certains cas, je reçois le mauvais PSN, ce qui entraîne parfois dans les informations étant nulle, d'autres fois il contient

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; 

Ce service système est évidemment pas l'application que je suis à la recherche pour. J'ai vérifié un autre attribut: keyAddressAttr et keyOriginalAdressAttr sont les mêmes. KeyEventSourceAttr était une autre chose qui semblait intéressante, mais je ne trouve aucune documentation à ce sujet - le SInt16 retourné ne semble pas être un pid ou autre chose qui pourrait m'être utile. Mes questions seraient:
1. Y at-il quelque chose de mal avec le code cité?
2. Où puis-je trouver de la documentation sur keyEventSourceAttr?
3. Que se passe-t-il ici - pourquoi ce service système est-il la source de mon événement au lieu du processus?
4. Quel est un moyen fiable de trouver la source réelle (une application) lorsqu'on lui demande d'ouvrir des fichiers? Puisque c'est un événement, il doit avoir une source; Je ne veux pas garder une trace des applications qui étaient actives récemment et pourrait être l'expéditeur.

+0

Je ne sais pas beaucoup sur Apple Events, mais si c'est l'ouverture d'url, quelque chose comme 'openfiles: // fichier: & sourceapplication: ' Vous pouvez savoir quelle est l'application source. Avez-vous lu la documentation d'Apple à ce sujet? Bonne chance – theShay

Répondre

Questions connexes