macos - Cómo ocultar el ícono de Dock
cocoa icons (6)
Actualización para Swift: (El uso de ambos lados se ha presentado anteriormente, tienen el mismo resultado)
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
}
Quiero hacer una preferencia por ocultar el ícono de Dock y mostrar un NSStatusItem
. Puedo crear StatusItem pero no sé cómo eliminar el icono de Dock. : - /
¿Algunas ideas?
Creo que estás buscando LSUIElement
en Info.plist
LSUIElement (String). Si esta clave se establece en "1", Launch Services ejecuta la aplicación como una aplicación de agente. Las aplicaciones del agente no aparecen en el Dock o en la ventana Force Quit. Aunque normalmente se ejecutan como aplicaciones en segundo plano, pueden aparecer en primer plano para presentar una interfaz de usuario, si así lo desean.
Vea una breve discusión here sobre cómo activarlo / desactivarlo
En Xcode 4 se muestra como "La aplicación es agente (UIElement)" y es booleana.
En su control de Info.plist, haga clic en un espacio vacío y seleccione "Agregar fila" en el menú Escriba "Aplicación es agente (UIElement)" Configúrelo SÍ.
Para hacerlo opcional, agregué la siguiente línea a mi código (¡gracias Valexa!)
// hide/display dock icon
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) {
//hide icon on Dock
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}
Motivado desde here , puedes hacer:
[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
o
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
Esto debería ocultar el ícono de dock. Consulte here para obtener documentación acerca de NSApplicationActivationPolicy
.
Consulte también la pregunta relacionada "Iniciar un proceso de GUI en Mac OS X sin el icono de dock" .
Para hacerlo, respetando las directrices de Apple de no modificar paquetes de aplicaciones y garantizar que las aplicaciones Mac App Store / (aplicaciones Lion?) No tengan su firma rota por la modificación de info.plist, puede establecer LSUIElement en 1 de forma predeterminada, cuando el los lanzamientos de aplicaciones hacen:
ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
para mostrar su icono de dock, o omitir esto si el usuario eligió no querer el ícono.
Solo hay un efecto secundario, el menú de la aplicación no se muestra hasta que pierde y recupera el foco.
Fuente: Hacer una casilla de verificación Activar y desactivar el icono de la base
Personalmente prefiero no configurar ninguna opción Info.plist y usar TransformProcessType(&psn, kProcessTransformToForegroundApplication)
o TransformProcessType(&psn, kProcessTransformToUIElementApplication)
función de la configuración del usuario.
Si desea convertirlo en una preferencia de usuario, entonces no puede usar UIElement. UIElement reside en el paquete de la aplicación, no debe editar ninguno de los archivos en el paquete de la aplicación, ya que esto invalidará la firma de los paquetes.
La mejor solución que he encontrado se basa en este excelente artículo . Mi solución se basa en el comentario de Dan. En resumen, no hay forma de hacer esto con Cocoa, pero es posible con un poquito de código de carbono.
El artículo también sugiere crear una aplicación auxiliar que maneje el ícono del dock exclusivamente. La aplicación principal luego inicia y elimina esta aplicación según las preferencias de los usuarios. Este enfoque me parece más sólido que usar el código de carbono, pero aún no lo he probado.