Como ocultar o ícone do Dock

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

Alguma ideia?

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

LSUIElement (String). Se essa chave estiver configurada como “1”, o Launch Services executará o aplicativo como um aplicativo de agente. Os aplicativos do agente não aparecem no Dock nem na janela Force Quit. Embora eles normalmente sejam executados como aplicativos de segundo plano, eles podem vir ao primeiro plano para apresentar uma interface de usuário, se desejado.

Veja uma breve discussão aqui sobre como ligar / desligar

Para fazer isso de acordo com as diretrizes da Apple de não modificar os pacotes de aplicativos e garantir que os aplicativos / aplicativos do Lion App não terão sua assinatura quebrada pela modificação do info.plist, você pode definir o LSUIElement como 1 por padrão, quando o lançamentos de aplicativos:

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

para mostrar o ícone do dock ou ignorar isso se o usuário optar por não querer o ícone.

Há apenas um efeito colateral, o menu do aplicativo não é mostrado até que ele perca e recupere o foco.

Fonte: Fazendo uma checkbox de seleção Ativar e desativar o ícone do Dock

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

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

Objetivo-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

  • Resposta que inspirou esta: Como criar um aplicativo auxiliar (LSUIElement) que também tenha um ícone de dock (removível)
  • Documentação para NSRunningApplicationActivationPolicy .
  • Uma questão relacionada: “Iniciar um processo GUI no Mac OS X sem o ícone de encaixe” .

No Xcode 4 é mostrado como “Application is agent (UIElement)” e é booleano.

Em seu Info.plist, clique com o controle em um espaço vazio e selecione “Add Row” no menu “Application is agent (UIElement)”. Set it YES.

Para torná-lo opcional, adicionei a seguinte linha ao meu código (obrigado 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 as duas formas 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. O UIElement reside no pacote de aplicativos que você não deve editar em nenhum dos arquivos do pacote de aplicativos, pois isso invalidará a assinatura do pacote.

A melhor solução que encontrei baseia-se neste excelente artigo . Minha solução é baseada no comentário de Dan. Em suma, não há como fazer isso com o Cocoa, mas é possível com um pequeno código de carbono.

O artigo também sugere criar um aplicativo auxiliar que manipule exclusivamente o ícone do dock. O aplicativo principal, em seguida, inicia e mata este aplicativo, dependendo das preferências dos usuários. Essa abordagem me parece mais robusta do que usar o código Carbon, mas ainda não experimentei.