2014-04-26 2 views
0

J'utilise les idées dans this thread pour masquer l'icône Dock de mon application en option. Si l'icône de la station d'accueil s'affiche après tout, la barre de menu doit s'afficher également. Seulement avec Jiulong's answer je n'ai pas été en mesure de faire ce travail. La barre de menu est toujours cachée.Masquage de l'icône du Dock sans masquer la barre de menu

Donc, fondamentalement, « L'application est agent » est réglé sur « 1 » dans le InfoPList, et ce code est utilisé:

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"LaunchAsAgentApp"]) { 
    ProcessSerialNumber psn = { 0, kCurrentProcess }; 
    TransformProcessType(&psn, kProcessTransformToForegroundApplication); 
    SetSystemUIMode(kUIModeNormal, 0); 
    [[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:@"com.apple.dock" options:NSWorkspaceLaunchDefault additionalEventParamDescriptor:nil launchIdentifier:nil]; 
    [[NSApplication sharedApplication] activateIgnoringOtherApps:TRUE]; 
} 

Alors, pourquoi ne pas la barre de menu apparaissent, jusqu'à ce que je cache et se recentre l'application? Y a-t-il un correctif pour cela? J'ai vu que le 'Quick Search Box' for mac app ne montre pas la barre de menu lors du lancement soit ...


EDIT: Je pris contact avec Apple, et on m'a donné un carbone et une solution non-carbone. Étant donné un nouveau projet avec « Application est Agent » est « OUI » dans le fichier plist, alors ce code pourrait être utilisé dans la classe AppDelegate:

#define USE_CARBON 0 

// 
// Note: NSLogDebug is defined in the projects pre-compiled (.pch) file 
// 

@implementation AppDelegate 
{ 
    BOOL show_icon; 
} 

// Application will finish launching 
- (void)applicationWillFinishLaunching:(NSNotification *)notification { 
    NSLogDebug(); 
    NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) { 
     // exit(173); 
    } 

#if 1 
    show_icon = YES; 
#else 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *hasDockIconDefaultsKey = @"Has Dock Icon?"; 
    // note: toggles value on each run (normally set from user pref pannel) 
    show_icon = [userDefaults boolForKey:hasDockIconDefaultsKey]; 
    [userDefaults setBool:!show_icon forKey:hasDockIconDefaultsKey]; 
#endif // if 1 
    if (show_icon) { 
     [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 
     [NSApp setPresentationOptions:NSApplicationPresentationDefault]; 
     [NSMenu setMenuBarVisible:NO]; 
     [NSMenu setMenuBarVisible:YES]; 
    } 

    [NSApp activateIgnoringOtherApps:YES]; 
} // applicationWillFinishLaunching 

// Application did finish launching 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSLogDebug(); 
    // Insert code here to initialize your application 
    if (show_icon) { 
#if USE_CARBON 
     ProcessSerialNumber psn = {0, kCurrentProcess}; 
     OSStatus returnCode = TransformProcessType(&psn, kProcessTransformToForegroundApplication); 
     if (noErr != returnCode) { 
      NSLog(@"TransformProcessType error: %d (0x%0X)", returnCode, returnCode); 
     } 

     ProcessSerialNumber psnx = {0, kNoProcess}; 
     GetNextProcess(&psnx); 
     SetFrontProcess(&psnx); 
#else // if 0 
     NSWorkspace *sharedWorkspace = [NSWorkspace sharedWorkspace]; 
     NSRunningApplication * menuBarOwningApplication = [sharedWorkspace menuBarOwningApplication]; 
     (void) [menuBarOwningApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps]; 
#endif 
     [self performSelector:@selector(setFront) withObject:nil afterDelay:0.]; 
    } 
} // applicationDidFinishLaunching 

// Close app when main window is closed 
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { 
    return (YES); 
} 

- (void)setFront; 
{ 
#if USE_CARBON 
    ProcessSerialNumber psn = {0, kCurrentProcess}; 
    SetFrontProcess(&psn); 
#else // if USE_CARBON 
    [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; 
#endif // USE_CARBON 
} 

@end 

Notez que j'ai déposé un rapport de bogue aussi.

Répondre

1

D'abord, vous devez utiliser -[NSApplication setActivationPolicy:] plutôt que TransformProcessType() et -[NSApplication setPresentationOptions:] plutôt que dans le code SetSystemUIMode() moderne. Si le passage à ceux-ci ne suffit pas pour résoudre le problème avec la barre de menu ne pas mettre à jour, je recommande que vous essayez d'utiliser -setPresentationOptions: ou +[NSMenu setMenuBarVisible:] pour masquer la barre de menu, puis immédiatement inverser cette opération.

Également, abandonnez cette activité en essayant d'activer le Dock.

Donc, quelque chose comme:

if (![[NSUserDefaults standardUserDefaults] boolForKey:@"LaunchAsAgentApp"]) { 
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 
    [NSApp setPresentationOptions:NSApplicationPresentationDefault]; // probably not necessary since it's the default 
    [NSMenu setMenuBarVisible:NO]; // these two lines may not be necessary, either; using -setActivationPolicy: instead of TransformProcessType() may be enough 
    [NSMenu setMenuBarVisible:YES]; 
} 
+0

Cela fonctionne quand j'utilise 2 '+ [NSMenu setMenuBarVisible:]' lignes - merci beaucoup Ken! –

+0

Oh, et j'ai encore un problème avec cela - la barre de menu s'affiche maintenant, mais elle ne répond qu'aux clics lorsque l'application est cachée et recentrée. Le bouton sur la droite (les boutons de la barre d'état, tels que le bouton du spot) répondent tout le temps. Savez-vous ce qui pourrait se passer ici? –

+0

Pas en main, non. On dirait un bug de cacao. Bien sûr, le besoin de cacher et d'afficher la barre de menus est également important. –

Questions connexes