Comment masquer l’icône Dock

Je veux faire une préférence pour masquer l’icône Dock et afficher un NSStatusItem . Je peux créer le StatusItem mais je ne sais pas comment supprimer l’icône de Dock. : – /

Des idées?

Je pense que vous cherchez le LSUIElement dans Info.plist

LSUIElement (Ssortingng). Si cette clé est définie sur «1», Launch Services exécute l’application en tant qu’application d’agent. Les applications d’agent n’apparaissent pas dans le Dock ou dans la fenêtre Forcer à quitter. Bien qu’ils s’exécutent généralement en tant qu’applications d’arrière-plan, ils peuvent être mis en avant pour présenter une interface utilisateur si nécessaire.

Voyez une courte discussion sur l’activation / désactivation

Pour ce faire, tout en respectant les consignes d’Apple de ne pas modifier les bundles d’application et de garantir que la signature info.plist ne brisera pas la signature des applications / (applications Lion?) Du Mac App Store, vous pouvez définir LSUIElement sur 1 par défaut les lancements d’applications font:

 ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToForegroundApplication); 

pour afficher son icône de station d’accueil ou l’ignorer si l’utilisateur a choisi de ne pas vouloir l’icône.

Il n’ya qu’un effet secondaire, le menu de l’application n’est pas affiché jusqu’à ce qu’il perd et reprenne le focus.

Source: Création d’une case à cocher Activer et désactiver l’icône du Dock

Personnellement, je préfère ne pas définir d’option Info.plist et utiliser TransformProcessType(&psn, kProcessTransformToForegroundApplication) ou TransformProcessType(&psn, kProcessTransformToUIElementApplication) fonction du paramètre utilisateur.

Vous pouvez utiliser ce que l’on appelle la politique d’activation:

Objectif c

 // The application is an ordinary app that appears in the Dock and may // have a user interface. [NSApp setActivationPolicy: NSApplicationActivationPolicyRegular]; // The application does not appear in the Dock and does not have a menu // bar, but it may be activated programmatically or by clicking on one // of its windows. [NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory]; // The application does not appear in the Dock and may not create // windows or be activated. [NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited]; 

Swift 4

 // The application is an ordinary app that appears in the Dock and may // have a user interface. NSApp.setActivationPolicy(.regular) // The application does not appear in the Dock and does not have a menu // bar, but it may be activated programmatically or by clicking on one // of its windows. NSApp.setActivationPolicy(.accessory) // The application does not appear in the Dock and may not create // windows or be activated. NSApp.setActivationPolicy(.prohibited) 

Cela devrait cacher l’icône du dock.

Voir également

  • Réponse qui a inspiré celui-ci: Comment créer une application d’assistance (LSUIElement) qui possède également une icône de station d’accueil (amovible)
  • Documentation pour NSRunningApplicationActivationPolicy .
  • Une question connexe: “Démarrer un processus graphique sous Mac OS X sans icône Dock” .

Dans Xcode 4, il est affiché comme “Application is agent (UIElement)” et il est booléen.

Dans votre contrôle Info.plist, cliquez sur un espace vide et sélectionnez “Ajouter une ligne” dans le menu. Tapez “Application is agent (UIElement)”.

Pour le rendre facultatif, j’ai ajouté la ligne suivante à mon code (merci Valexa!)

  // hide/display dock icon if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) { //hide icon on Dock ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToForegroundApplication); } 

Mise à jour pour Swift: (Utiliser les deux moyens a été présenté ci-dessus, ils ont le même résultat)

 public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool { // Get transform state. var transformState: ProcessApplicationTransformState if state { transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication) } else { transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication) } // Show / hide dock icon. var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess)) let transformStatus: OSStatus = TransformProcessType(&psn, transformState) return transformStatus == 0 } public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool { var result: Bool if state { result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular) } else { result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory) } return result } 

Si vous voulez en faire une préférence utilisateur, vous ne pouvez pas utiliser UIElement. UIElement réside dans le bundle d’application, vous ne devez modifier aucun des fichiers du bundle d’application, car cela invalidera la signature du bundle.

La meilleure solution que j’ai trouvée est basée sur cet excellent article . Ma solution est basée sur le commentaire de Dan. En bref, il n’y a aucun moyen de faire cela avec Cocoa, mais c’est possible avec un tout petit code Carbon.

L’article suggère également de créer une application d’assistance qui gère uniquement l’icône du dock. L’application principale démarre alors et détruit cette application en fonction des préférences des utilisateurs. Cette approche me semble plus robuste que l’utilisation du code Carbon, mais je ne l’ai pas encore essayé.