Mac OS X - Монитор запуска приложения?
-
02-10-2019 - |
Вопрос
Я хочу написать простое Menubar приложение для Mac OS X. Пользователю захочет только использовать это приложение, когда Safari открыт. Чтобы не беспокою меню ненужно, я хочу скрыть и показать значок меню, в зависимости от того, открыт ли Safari или нет.
Может ли некоторое уведомление о том, что мое приложение может зарегистрироваться? Единственный обходной путь, который я могу себе представить, это опрос беговых процессов и посмотреть, запущен ли Safari, но это не кажется элегантным способом решить мою проблему ...
Решение
NSWorkspaceDidLaunchApplicationNotification
и NSWorkspaceDidTerminateApplicationNotification
. Отказ (Есть эквивалентные углеродные события.)
Другие советы
Использовать keventappfrontswitched в менеджере углеродных событий Чтобы получить уведомления, когда другое приложение становится активным.
Используйте этот код: http://cl.ly/2lbb.
// usleep(40500);
ProcessNotif * x = [[ProcessNotif new] autorelease];
[x setProcessName: @"Safari"];
[x setTarget: self];
[x setAction: @selector(doStuff)];
[x start];
Это запускает селектор -doStuff
когда Safari работает. Если вы получите ошибку, безотчитнее usleep()
линия.
Есть та же проблема, но благодаря Jwwalker, документации и Google написали этот код:
// 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
}
}