Frage

Ich möchte eine einfache menubar App für Mac OS X. Der Benutzer will nur schreiben, die App verwenden, wenn Safari geöffnet wird. Um nicht unnötig unübersichtlich die Menüleiste, ich will zu verstecken und zeigt die menubar Symbol je nachdem, ob Safari geöffnet ist oder nicht.

Gibt es vielleicht eine Benachrichtigung, dass mein App registrieren kann? Die Problemumgehung nur kann ich mich vorstellen Umfrage die laufenden Prozesse und sehen, ob Safari gestartet wird, aber das scheint nicht eine elegante Art und Weise zu sein, mein Problem zu lösen ...

War es hilfreich?

Lösung

NSWorkspaceDidLaunchApplicationNotification und NSWorkspaceDidTerminateApplicationNotification. (Es gibt äquivalente Kohlenstoff Events.)

Andere Tipps

Verwenden Sie kEventAppFrontSwitched in Carbon-Event Manager erhalten eine Benachrichtigung, wenn eine andere Anwendung aktiv wird.

Mit diesem Code: http://cl.ly/2LbB

// usleep(40500);

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

Damit wird der Selektor -doStuff laufen, wenn Safari läuft. Wenn Sie einen Fehler, Kommentar- der usleep() Linie zu bekommen.

Habe gleiches Problem, aber dank JWWalker, Dokumentation und Google schrieb diesen Code:

// 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
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top