2009-04-18 3 views
9

Je souhaite être averti lorsque l'application en cours va changer. J'ai regardé NSWorkspace. Il n'enverra des notifications que lorsque votre propre application deviendra active ou perdra l'activité. Je veux être informé de chaque application. Comment puis-je faire cela dans Cocoa?Recevoir une notification lorsque l'application en cours change dans Cocoa

+2

Il est impossible d'obtenir cette information en om Cacao. Vous devez utiliser Carbon Event Manager pour recevoir des notifications lorsqu'un processus autre que le vôtre devient actif. –

Répondre

12

Merci Jason. kEventAppFrontSwitched en carbone Event Manager est le mot magique

- (void) setupAppFrontSwitchedHandler 
{ 
    EventTypeSpec spec = { kEventClassApplication, kEventAppFrontSwitched }; 
    OSStatus err = InstallApplicationEventHandler(NewEventHandlerUPP(AppFrontSwitchedHandler), 1, &spec, (void*)self, NULL); 

    if (err) 
     NSLog(@"Could not install event handler"); 
} 

- (void) appFrontSwitched { 
    NSLog(@"%@", [[NSWorkspace sharedWorkspace] activeApplication]); 
} 

Et le gestionnaire

static OSStatus AppFrontSwitchedHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) 
{ 
    [(id)inUserData appFrontSwitched]; 
    return 0; 
} 
+0

Oui, j'ai fait un petit exemple pour quelqu'un qui a effectivement posté des notifications il y a quelques temps, mais je ne l'ai pas trouvé. Vous avez donné un bon résumé, vous devriez accepter cette réponse :) –

+0

Remarque: Pour réussir à créer une application en utilisant ceci, vous devez ajouter les frameworks Carbon et Core Services à votre build et inclure et dans le fichier d'implémentation qui contient le gestionnaire. Voir http://stackoverflow.com/questions/801976/mixing-c-functions-in-an-objective-c-class/ pour savoir comment mélanger C avec Objective-C – Christoph

+0

Vous réglez. Merci! – Enchilada

21

Si vous ciblez 10.6 ou plus tard, il y a une notification pour cela:

// NSWorkspaceDidActivateApplicationNotification 
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(foremostAppActivated:) name:NSWorkspaceDidActivateApplicationNotification object:nil]; 

docs d'Apple : http://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html#//apple_ref/doc/uid/20000391-SW97

+0

Confirmé travaillant en 2014 sur OS X 10.9 (sauf que j'ai dû enlever le deux-points dans la méthode @selector). Je vous remercie! – Unknown123

+0

Les deux-points sont là parce que je m'attends à ce que votre sélecteur ressemble à ceci: '- (void) foremostAppActivated: (NSNotification *) notification' – mrwalker

Questions connexes