Какао: скрыть одно приложение - PullRequest
1 голос
/ 13 июня 2009

Можно ли скрыть одно конкретное приложение, используя какао?

Я знаю, что вы можете скрыть все другие приложения, используя следующий код

[[NSWorkspace sharedWorkspace] performSelectorOnMainThread:@selector(hideOtherApplications) withObject:NULL waitUntilDone:NO];

Но возможно ли скрыть только одно конкретное приложение, например Safari?

Ответы [ 3 ]

8 голосов
/ 24 мая 2010

Если вы нацелены на Mac OS 10.6+, вы можете использовать новый класс NSRunningApplication:

- (BOOL) hideAppWithBundleID:(NSString *)bundleID
{
    NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:bundleID];
    if ([apps count] == 0)
        return NO;
    return [(NSRunningApplication *)[apps objectAtIndex:0] hide];
}
6 голосов
/ 13 июня 2009

вы можете сделать это с appleScriptcript:

tell application "System Events" to set visible of process "Safari" to false

или вызовите тот же яблочный скрипт из какао, позвонив по телефону:

NSString * source = @"tell application \"System Events\" to set visible of process \"Safari\" to false";
NSAppleScript * script = [[NSAppleScript alloc] initWithSource:source];
[script executeAndReturnError:nil];
[script release];
3 голосов
/ 14 июня 2009

Или если вы хотите избежать Apple Script и использовать идентификатор пакета вместо имени приложения, которое может быть локализовано, как указал Майк:

for (NSDictionary *app in [[NSWorkspace sharedWorkspace] launchedApplications])
{
    if ([@"com.apple.Safari" isEqualToString:[app objectForKey:@"NSApplicationBundleIdentifier"]])
    {
        ProcessSerialNumber psn;
        GetCurrentProcess(&psn); // Initialize the Process Manager
        psn.highLongOfPSN = [[app objectForKey:@"NSApplicationProcessSerialNumberHigh"] intValue];
        psn.lowLongOfPSN = [[app objectForKey:@"NSApplicationProcessSerialNumberLow"] intValue];
        ShowHideProcess(&psn, NO);
    }
}
...