2009-06-12 4 views
1

Est-il possible de masquer une application spécifique en utilisant du cacao?Cacao: Masquer une application

Je sais que vous pouvez masquer toutes les autres applications en utilisant le code suivant

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

Mais est-il possible de cacher une seule application spécifique dire Safari par exemple?

Répondre

6

vous pouvez le faire avec AppleScript:

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

ou appelez le même AppleScript à partir de cacao en appelant:

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]; 
+0

Merci, fonctionne parfaitement –

+4

Notez que tout cela est probablement très bien pour Safari, vous ne voudriez pas qu'il hardcode pour d'autres applications que leur le nom du processus peut être localisé pour correspondre aux préférences de l'utilisateur –

3

Ou si vous voulez éviter d'Apple Script et utiliser l'identificateur de paquet à la place du nom de l'application qui pourrait être localisé comme étant Mike:

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); 
    } 
} 
7

Si vous êtes e ciblant Mac OS 10.6+, vous pouvez utiliser la nouvelle classe NSRunningApplication:

- (BOOL) hideAppWithBundleID:(NSString *)bundleID 
{ 
    NSArray *apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:bundleID]; 
    if ([apps count] == 0) 
     return NO; 
    return [(NSRunningApplication *)[apps objectAtIndex:0] hide]; 
}