Вопрос

Я хочу написать простое 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
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top