Mac OS X - Monitor app lancio?
-
02-10-2019 - |
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 ...
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
}
}