Pergunta

Eu quero fazer uma preferência para esconder o ícone do Dock e mostrando um NSStatusItem. Eu posso criar o StatusItem mas eu não sei como remover o ícone do Dock. : - /

Todas as idéias?

Foi útil?

Solução

Eu acho que você está procurando o LSUIElement na Info.plist

LSUIElement (String). Se esta chave é definido como “1”, Lançamento de Serviços executa o aplicativo como um aplicativo agente. aplicações de agente não aparecem no Dock ou na janela Force Quit. Embora eles normalmente são executados como aplicativos em segundo plano, eles podem vir para o primeiro plano para apresentar uma interface de usuário, se desejar.

Veja uma breve discussão aqui cerca de transformá-lo on / off

Outras dicas

Para fazê-lo enquanto permanente com as diretrizes da Apple de não modificar pacotes de aplicativos e garantia de que o Mac App Store apps / (Lion Apps?) Não vai ter a sua assinatura quebrado por modificação info.plist você pode definir LSUIElement a 1 por padrão em seguida, quando o aplicativo é iniciado fazer:

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

para mostrar que é ícone de encaixe, ou ignorar isso, se o usuário optou por não deseja que o ícone.

Não é apenas um efeito colateral, o menu do aplicativo não é indicada até perdas e recupera o foco.

Fonte: Fazendo uma caixa de seleção Alternar The Dock Ícone on e Off

Pessoalmente eu prefiro não definir qualquer opção e uso TransformProcessType(&psn, kProcessTransformToForegroundApplication) ou TransformProcessType(&psn, kProcessTransformToUIElementApplication) Info.plist com base no que é a configuração do usuário.

Você pode usar o que é chamado de Política de ativação:

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)

Isso deve ocultar o ícone do dock.

Veja também

No Xcode 4 mostra-se como "Aplicação é agente (UIElement)" e é booleano.

Em seu controle clique Info.plist para um espaço vazio e selecione "Adicionar linha" no menu Digite "Aplicação é agente (UIElement)" Defina-SIM.

Para torná-la opcional eu adicionei a seguinte linha para o meu código (graças Valexa!)

 // hide/display dock icon
if (![[NSUserDefaults  standardUserDefaults] boolForKey:@"hideDockIcon"]) {
    //hide icon on Dock
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
} 

Atualização para Swift: (Use os dois lados foi apresentado acima, eles têm o mesmo 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
}

Se você quiser torná-lo uma preferência do usuário, então você não pode usar UIElement. reside UIElement na aplicação pacote você não deve editar qualquer um dos arquivos do pacote aplicativo, pois isso invalida a assinatura pacotes.

A melhor solução que eu encontrei é baseado em este excelente artigo . Minha solução é baseada no comentário por Dan. Em suma, não há nenhuma maneira de fazer isso com Cacau, mas é possível com um pouco de código de carbono.

O artigo também sugere fazendo um aplicativo helper que manipula o ícone de encaixe exclusivamente. O aplicativo principal, em seguida, começa e mata este aplicativo, dependendo das preferências dos usuários. Esta abordagem parece-me ser mais robusto do que usando o código de carbono, mas eu não tentei ainda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top