2009-04-18 14 views
9

Deseo recibir una notificación cuando cambie la aplicación actual. Miré NSWorkspace. Enviará notificaciones solo cuando su propia aplicación se active o pierda la actividad. Deseo recibir información sobre cada aplicación. ¿Cómo puedo hacer esto en Cocoa?Recibir notificaciones cuando la aplicación actual cambie en Cocoa

+2

Es imposible obtener esta información fr om Cocoa. Debe utilizar Carbon Event Manager para recibir notificaciones cuando se active un proceso que no sea el suyo. –

Respuesta

12

Gracias Jason. kEventAppFrontSwitched en Carbon Event Manager es la palabra mágica

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

y el manejador

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

Sí, hice un pequeño ejemplo para alguien que realmente publicó notificaciones hace un tiempo, pero no pude encontrarlo. Usted dio un buen resumen, debe aceptar esta respuesta :) –

+0

Observación: Para construir con éxito una aplicación que utiliza esto, debe agregar los Frameworks de Carbon and Core Services a su compilación e incluir y en el archivo de implementación que contiene el controlador. Vea http://stackoverflow.com/questions/801976/mixing-c-functions-in-an-objective-c-class/ sobre cómo mezclar C con Objective-C – Christoph

+0

Usted regla. ¡Gracias! – Enchilada

21

Si usted está apuntando 10.6 o posterior hay una notificación de este:

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

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

+0

Se confirmó que funcionaba en 2014 en OS X 10.9 (excepto que tuve que eliminar los dos puntos en el método @selector). ¡Gracias! – Unknown123

+0

El colon está allí porque espero que su selector se vea así: '- (void) foremostAppActivated: (NSNotification *) notification' – mrwalker

Cuestiones relacionadas