Mac OS X - контролировать запуск приложения? - PullRequest
0 голосов
/ 12 сентября 2010

Я хочу написать простое приложение menubar для Mac OS X. Пользователь захочет использовать это приложение только при открытом Safari.Чтобы не загромождать меню излишне, я хочу скрыть и отобразить значок меню в зависимости от того, открыт Safari или нет.

Может быть, есть какое-то уведомление, что мое приложение может зарегистрироваться?Единственный обходной путь, который я могу себе представить, - опросить запущенные процессы и посмотреть, запущен ли Safari, но это не выглядит элегантным способом решения моей проблемы ...

Ответы [ 4 ]

3 голосов
/ 12 сентября 2010

NSWorkspaceDidLaunchApplicationNotification и NSWorkspaceDidTerminateApplicationNotification. (Есть эквивалентные Carbon Events.)

1 голос
/ 12 сентября 2010

Используйте kEventAppFrontSwitched в Carbon Event Manager , чтобы получать уведомления, когда другое приложение становится активным.

0 голосов
/ 02 сентября 2013

У меня та же проблема, но благодаря 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
    }
}
0 голосов
/ 12 сентября 2010

Используйте этот код: http://cl.ly/2LbB

// usleep(40500);

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

При запуске Safari будет запущен селектор -doStuff.Если вы получили ошибку, раскомментируйте строку usleep().

...