web-dev-qa-db-fra.com

Comment masquer l'icône du Dock

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

Des idées?

60
papr

Je pense que vous recherchez le LSUIElement dans Info.plist

LSUIElement (chaîne). 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 fonctionnent généralement en tant qu'applications en arrière-plan, ils peuvent apparaître au premier plan pour présenter une interface utilisateur si vous le souhaitez.

Voir une courte discussion ici sur l'activation/la désactivation

73
epatel

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 masquer l'icône du dock.

Voir également

50
Albert

Pour le faire tout en respectant les directives Apple Apple de ne pas modifier les bundles d'applications et pour garantir que les applications Mac App Store/(applications Lion?) Ne verront pas leur signature rompue par la modification info.plist, vous pouvez définissez LSUIElement sur 1 par défaut, puis au lancement de l'application:

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

pour afficher son icône de dock, ou contourner cela si l'utilisateur a choisi de ne pas vouloir l'icône.

Il n'y a qu'un effet secondaire, le menu de l'application n'est pas affiché jusqu'à ce qu'il perde et retrouve le focus.

Source: Activation et désactivation d'une case à cocher pour activer ou désactiver l'icône du Dock

Personnellement, je préfère ne définir aucune option Info.plist et utiliser TransformProcessType(&psn, kProcessTransformToForegroundApplication) ou TransformProcessType(&psn, kProcessTransformToUIElementApplication) en fonction de ce qui est le paramètre utilisateur.

48
valexa

Dans Xcode 4, il est indiqué comme "L'application est un 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 Type "L'application est un agent (UIElement)" Réglez-le sur OUI.

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

Mise à jour pour Swift: (Utiliser les deux sens 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
}
9
Huy Nguyen

Si vous souhaitez en faire une préférence utilisateur, vous ne pouvez pas utiliser UIElement. UIElement réside dans le bundle d'application, vous ne devez pas modifier les fichiers du bundle d'application car cela invaliderait la signature des bundles.

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 le faire avec Cocoa, mais c'est possible avec un tout petit peu de code Carbon.

L'article suggère également de créer une application d'assistance qui gère exclusivement l'icône du dock. L'application principale démarre ensuite et tue 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ée.

2
Benedict Cohen