Domanda

Voglio scrivere una semplice applicazione barra dei menu per Mac OS X. L'utente dovrà solo vuole utilizzare tale applicazione quando Safari è aperto. Per non ingombrare la barra dei menu inutilmente, voglio nascondere e mostrare la barra dei menu icona a seconda che Safari è aperto o no.

C'è forse qualche notifica che la mia app potrebbe iscriversi? L'unica soluzione che posso immaginare è sondaggio i processi in esecuzione e vedere se Safari è lanciato, ma questo non sembra essere un modo elegante per risolvere il mio problema ...

È stato utile?

Soluzione

NSWorkspaceDidLaunchApplicationNotification e NSWorkspaceDidTerminateApplicationNotification. (Ci sono carbonio equivalente Eventi.)

Altri suggerimenti

kEventAppFrontSwitched in Carbon Event Manager per ricevere notifiche quando un'altra applicazione diventa attiva.

di questo codice: http://cl.ly/2LbB

// usleep(40500);

ProcessNotif * x = [[ProcessNotif new] autorelease];
[x setProcessName: @"Safari"];
[x setTarget: self];
[x setAction: @selector(doStuff)];
[x start];

Questo verrà eseguito il selettore di -doStuff quando Safari viene eseguito. Se si verifica un errore, rimuovere il commento dalla linea di usleep().

Ha ottenuto lo stesso problema, ma grazie a JWWalker, documentazione e Google ha scritto questo codice:

// i need to register on button event, you can do it even in applicationDidFinishLaunching
- (IBAction)Btn_LoginAction:(id)sender {
    ...
    NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
    [center addObserver:self selector:@selector(appLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil];
    [center addObserver:self selector:@selector(appTerminated:) name:NSWorkspaceDidTerminateApplicationNotification object:nil];
}

// remember to unregister
- (void)ManageLogout:(NSInteger)aResult {
    ...
    NSNotificationCenter *center = [[NSWorkspace sharedWorkspace] notificationCenter];
    [center removeObserver:self name:NSWorkspaceDidLaunchApplicationNotification object:nil];
    [center removeObserver:self name:NSWorkspaceDidTerminateApplicationNotification object:nil];
}

- (void)appLaunched:(NSNotification *)note {
    [GTMLogger myLog:kGTMLoggerLevelDebug fmt:@"MainWinDelegate::appLaunched: %@ (%@)\n", [[note userInfo] objectForKey:@"NSApplicationBundleIdentifier"], [[note userInfo] objectForKey:@"NSApplicationProcessIdentifier"]];

    if ( [[[note userInfo] objectForKey:@"NSApplicationBundleIdentifier"] isEqualToString:@"app.you.monitor.bundle.identifier"] ) {
        // do stuff
    }
}

- (void)appTerminated:(NSNotification *)note {
    [GTMLogger myLog:kGTMLoggerLevelDebug fmt:@"MainWinDelegate::appTerminated: %@ (%@)\n", [[note userInfo] objectForKey:@"NSApplicationBundleIdentifier"], [[note userInfo] objectForKey:@"NSApplicationProcessIdentifier"]];

    if ( [[[note userInfo] objectForKey:@"NSApplicationBundleIdentifier"] isEqualToString:@"app.you.monitor.bundle.identifier"] ) {
        // do stuff
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top