2010-09-12 7 views
0

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

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

ответ

3

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

0

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

+0

Как работает 'usleep' вызов справки с«ошибкой»? Какую «ошибку» вы имеете в виду? –

+0

Я использовал некоторый открытый исходный код, и я получил некоторую ошибку и раскомментировал, что эта строка исправила проблему. –

0

Есть такая же проблема, но благодаря 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 
    } 
}