Je veux faire une préférence pour masquer l'icône du Dock et afficher une NSStatusItem
. Je peux créer le StatusItem mais je ne sais pas comment supprimer l'icône du Dock :-/.
Des idées ?
Je veux faire une préférence pour masquer l'icône du Dock et afficher une NSStatusItem
. Je peux créer le StatusItem mais je ne sais pas comment supprimer l'icône du Dock :-/.
Des idées ?
Vous pouvez utiliser ce que l'on appelle la politique d'activation :
// 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];
// 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.
NSRunningApplicationActivationPolicy
.
D'après les documents d'Apple : Actuellement, NSApplicationActivationPolicyNone et NSApplicationActivationPolicyAccessory peuvent être changées en NSApplicationActivationPolicyRegular, mais les autres modifications ne sont pas prises en charge.
Je pense que vous cherchez le LSUIElement
dans le fichier Info.plist
LSUIElement (Chaîne). Si cette clé a la valeur "1", les services de lancement exécutent l'application en tant qu'application agent. Les applications d'agent n'apparaissent pas dans le Dock ou dans la fenêtre Force Quit. Bien qu'elles s'exécutent généralement en arrière-plan, elles peuvent venir au premier plan pour présenter une interface utilisateur si nécessaire.
Voir une brève discussion aquí sur le fait de l'allumer ou de l'éteindre
Pour le faire tout en respectant les directives d'Apple de ne pas modifier les paquets d'applications et pour garantir que les applications du Mac App Store/(applications Lion ?) ne verront pas leur signature brisée par la modification d'info.plist, vous pouvez définir LSUIElement à 1 par défaut puis, au lancement de l'application, faire :
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
pour afficher son icône de dock, ou contourner cette opération si l'utilisateur a choisi de ne pas vouloir l'icône.
Il n'y a qu'un seul effet secondaire, le menu de l'application n'est pas affiché jusqu'à ce qu'elle perde et retrouve le focus.
Source : Faire en sorte qu'une case à cocher permette d'activer et de désactiver l'icône du Dock
Personnellement, je préfère ne pas paramétrer l'option Info.plist et utiliser TransformProcessType(&psn, kProcessTransformToForegroundApplication)
o TransformProcessType(&psn, kProcessTransformToUIElementApplication)
en fonction des paramètres de l'utilisateur.
Bon conseil ! Merci pour votre aide ! Vous voudrez toujours masquer l'icône du Dock de cette manière afin de vous assurer que votre application signée fonctionne.
Les solutions dérivées de ce codepath ne permettent pas une application qui veut réellement pour être LSUIElement YES (c'est-à-dire ne pas avoir de menubar, etc.). En basculant le processus de cette manière, un menu s'affichera comme indiqué dans la réponse. Je respecte certainement le fait que c'est ce qui se rapproche le plus d'une réponse pour cette fonctionnalité négligée, mais ce n'est pas une solution précise. Je dis aux utilisateurs d'ajouter manuellement l'application au Dock s'ils veulent qu'une icône s'y trouve.
Dans Xcode, il est affiché comme "Application is agent (UIElement)" et il est booléen.
Dans votre Info.plist, contrôlez-cliquez sur un espace vide et sélectionnez "Ajouter une rangée" dans le menu. Tapez "Application is agent (UIElement)". Définissez-le sur 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);
}
Si vous voulez en faire une préférence de l'utilisateur, vous ne pouvez pas utiliser UIElement. UIElement réside dans le bundle de l'application. Vous ne devez pas modifier les fichiers du bundle de l'application car cela invaliderait 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 peu de code Carbon.
L'article suggère également de créer une application auxiliaire qui gère exclusivement l'icône du dock. L'application principale démarre et tue ensuite cette application en fonction des préférences de l'utilisateur. Cette approche me semble plus robuste que l'utilisation du code Carbon, mais je ne l'ai pas encore essayée.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Si votre application est basée sur Qt5, vous devez également définir l'envvar
QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM