Mac OS X - контролировать запуск приложения?

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

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


person ryyst    schedule 12.09.2010    source источник


Ответы (4)


NSWorkspaceDidLaunchApplicationNotification и NSWorkspaceDidTerminateApplicationNotification. (Есть эквивалентные углеродные события.)

person JWWalker    schedule 12.09.2010

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

person Chin Huang    schedule 12.09.2010

Используйте этот код: 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().

person Alexsander Akers    schedule 12.09.2010
comment
Как вызов usleep помогает при «ошибке»? О какой «ошибке» вы говорите? - person Peter Hosey; 14.09.2010
comment
Я использовал некоторый открытый исходный код, и я получил какую-то ошибку, и раскомментирование этой строки устранило проблему. - person Alexsander Akers; 14.09.2010

Получил ту же проблему, но благодаря 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
    }
}
person Shebuka    schedule 02.09.2013