Question

Je souhaite préférer 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?

Était-ce utile?

La solution

Je pense que vous recherchez le LSUIElement dans l'Info.plist

  

LSUIElement (String). 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 ni dans la fenêtre Forcer à quitter. Bien qu’elles fonctionnent généralement en arrière-plan, elles peuvent, si vous le souhaitez, être présentées au premier plan.

Voir une brève discussion ici sur la transformation on / off

Autres conseils

Pour le faire tout en respectant les consignes de Apple pour ne pas modifier les ensembles d'applications et pour garantir que la signature des applications du Mac App Store / (applications du Lion?) ne sera pas brisée par la modification info.plist, vous pouvez définir LSUIElement sur 1 par défaut puis, lorsque l'application démarre, faites:

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

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

Il n’existe qu’un seul effet secondaire: le menu de l’application n’apparaît que s’il perd et retrouve le focus.

Source: Créer une case à cocher Basculer l'icône du Dock Activer et désactiver

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

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

Objective-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)

Ceci devrait masquer l'icône du dock.

Voir aussi

Dans Xcode 4, il est indiqué par "Application is agent (UIElement)". et il est booléen.

Dans votre Info.plist, cliquez sur un espace vide, puis sélectionnez "Ajouter une ligne". du menu Type " L'application est un agent (UIElement) " Réglez-le OUI.

Pour le rendre optionnel, 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: (les deux méthodes ont été présentées ci-dessus, elles 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 souhaitez en faire une préférence utilisateur, vous ne pouvez pas utiliser UIElement. UIElement réside dans le bundle d’applications. Ne modifiez aucun des fichiers du bundle d’applications car cela invaliderait la signature des bundles.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top