0

Mac OS X 用のシンプルなメニューバー アプリを作成したいと考えています。ユーザーは、Safari が開いているときにのみそのアプリを使用したいと考えています。メニューバーが不必要に乱雑にならないように、Safari が開いているかどうかに応じて、メニューバーのアイコンを隠したり表示したりしたいと考えています。

私のアプリが登録できる通知はありますか?私が想像できる唯一の回避策は、実行中のプロセスをポーリングし、Safari が起動されているかどうかを確認することですが、それは私の問題を解決するエレガントな方法ではないようです...

4

4 に答える 4

3

NSWorkspaceDidLaunchApplicationNotificationNSWorkspaceDidTerminateApplicationNotification。(同等の炭素イベントがあります。)

于 2010-09-12T18:41:48.030 に答える
1

別のアプリケーションがアクティブになったときに通知を受け取るには、Carbon Event Manager で kEventAppFrontSwitched を使用します。

于 2010-09-12T15:11:40.417 に答える
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()行のコメントを外します。

于 2010-09-12T15:24:47.080 に答える
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
    }
}
于 2013-09-02T16:42:44.983 に答える