Pregunta

Quiero hacer una preferencia para ocultar el icono del Dock y mostrar un NSStatusItem . Puedo crear el elemento de estado pero no sé cómo eliminar el icono de Dock. : - /

¿Alguna idea?

¿Fue útil?

Solución

Creo que está buscando el LSUIElement en la lista de información

  

LSUIElement (String). Si esta clave se establece en "1", Launch Services ejecuta la aplicación como una aplicación de agente. Las aplicaciones de agente no aparecen en el Dock o en la ventana Forzar el cierre. Aunque normalmente se ejecutan como aplicaciones en segundo plano, pueden aparecer en primer plano para presentar una interfaz de usuario si lo desean.

Vea una breve discusión aquí sobre cómo convertirlo encendido / apagado

Otros consejos

Para hacerlo respetando las directrices de Apple de no modificar los paquetes de aplicaciones y garantizar que las aplicaciones de la Mac App Store / (¿Aplicaciones de Lion?) no se rompan con su firma por la modificación de info.plist, puede configurar el LSUIElement en 1 de forma predeterminada luego, cuando se inicie la aplicación, haga:

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

para mostrar su ícono de acoplamiento, u omitirlo si el usuario elige no querer el ícono.

Solo hay un efecto secundario, el menú de la aplicación no se muestra hasta que pierde y recupera el enfoque.

Fuente: Haciendo una casilla de verificación Alternar El icono del Dock Encendido y apagado

Personalmente prefiero no configurar ninguna opción de Info.plist y usar TransformProcessType (& amp; psn, kProcessTransformToForegroundApplication) o TransformProcessType (& amp; psn, kProcessTransformToUIElementApplication) basado en qué es la configuración del usuario.

Puedes usar lo que se llama Política de activación:

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)

Esto debería ocultar el icono del dock.

Ver también

En Xcode 4 se muestra como " La aplicación es agente (UIElement) " y es booleano.

En tu control de Info.plist, haz clic en un espacio vacío y selecciona " Añadir fila " del menu Tipo " La aplicación es agente (UIElement) " Establézcalo en SÍ.

Para que sea 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);
} 

Actualización para Swift: (Use las dos formas mencionadas 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
}

Si desea que sea una preferencia de usuario, no puede usar UIElement. La 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 del paquete.

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 poco de código de carbono.

El artículo también sugiere crear una aplicación de ayuda que maneje el ícono del dock exclusivamente. La aplicación principal se inicia y la mata, según las preferencias de los usuarios. Este enfoque me parece más robusto que usar el código Carbon, pero aún no lo he probado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top