Comment masquer l'icône du Dock
-
05-07-2019 - |
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?
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
- La réponse qui a inspiré celle-ci: Comment créer une application d'assistance (LSUIElement) qui possède également une icône de dock (amovible)
- Documentation pour
NSRunningApplicationActivationPolicy
. - Une question connexe: " Démarrer un processus d'interface graphique sous Mac OS X sans l'icône du dock .
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.