Come nascondere l'icona del Dock
-
05-07-2019 - |
Domanda
Voglio fare una preferenza per nascondere l'icona del Dock e mostrare un NSStatusItem
.
Posso creare StatusItem ma non so come rimuovere l'icona dal Dock. : - /
Qualche idea?
Soluzione
Penso che tu stia cercando il LSUIElement
nell'Info.plist
LSUIElement (stringa). Se questa chiave è impostata su & # 8220; 1 & # 8221 ;, Launch Services esegue l'applicazione come applicazione agente. Le applicazioni degli agenti non vengono visualizzate nel Dock o nella finestra Uscita forzata. Sebbene in genere vengano eseguiti come applicazioni in background, possono venire in primo piano per presentare un'interfaccia utente, se lo si desidera.
Guarda una breve discussione qui su come trasformarlo on / off
Altri suggerimenti
Per farlo rispettando le linee guida Apple per non modificare i pacchetti di applicazioni e per garantire che le app / (le app Lion? del Mac App Store) non abbiano la firma spezzata dalla modifica di info.plist, puoi impostare LSUIElement su 1 per impostazione predefinita quindi quando l'applicazione viene avviata:
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
per mostrare l'icona del dock o ignorarla se l'utente ha scelto di non voler l'icona.
C'è solo un effetto collaterale, il menu dell'applicazione non viene mostrato fino a quando non perde e riacquista attenzione.
Fonte: Creazione di una casella di controllo Attiva / disattiva l'icona del dock On e Off
Personalmente preferisco non impostare alcuna opzione Info.plist e utilizzare TransformProcessType (& amp; psn, kProcessTransformToForegroundApplication)
o TransformProcessType (& amp; psn, kProcessTransformToUIElementApplication)
in base a ciò che è l'impostazione dell'utente.
Puoi usare ciò che viene chiamato Politica di attivazione:
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)
Questo dovrebbe nascondere l'icona del dock.
Vedi anche
- Risposta che ha ispirato questo: Come creare un'applicazione di supporto (LSUIElement) che ha anche un'icona (rimovibile) nel dock
- Documentazione per
NSRunningApplicationActivationPolicy
. - Una domanda correlata: " Avvia un processo GUI in Mac OS X senza l'icona del dock " .
In Xcode 4 è mostrato come " L'applicazione è agente (UIElement) " ed è booleano.
Nel tuo Info.plist fai clic tenendo premuto il tasto Ctrl su uno spazio vuoto e seleziona " Aggiungi riga " dal menu Digitare " L'applicazione è agente (UIElement) " Impostalo SÌ.
Per renderlo facoltativo ho aggiunto la seguente riga al mio codice (grazie Valexa!)
// hide/display dock icon
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) {
//hide icon on Dock
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}
Aggiornamento per Swift: (utilizzare entrambi i modi è stato presentato sopra, hanno lo stesso risultato)
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
}
Se vuoi renderlo una preferenza dell'utente, non puoi usare UIElement. UIElement risiede nel bundle dell'applicazione che non dovresti modificare nessuno dei file nel bundle dell'app in quanto ciò invaliderà la firma del bundle.
La migliore soluzione che ho trovato si basa su questo eccellente articolo . La mia soluzione si basa sul commento di Dan. In breve, non c'è modo di farlo con Cocoa, ma è possibile con un po 'di codice Carbon.
L'articolo suggerisce inoltre di creare un'app di supporto che gestisca esclusivamente l'icona del dock. L'app principale quindi avvia e uccide questa app in base alle preferenze degli utenti. Questo approccio mi sembra più robusto rispetto all'utilizzo del codice Carbon, ma non l'ho ancora provato.