Как скрыть значок Dock - PullRequest
       43

Как скрыть значок Dock

60 голосов
/ 07 марта 2009

Я хочу сделать предпочтение, чтобы скрыть значок Dock и показать NSStatusItem. Я могу создать StatusItem, но я не знаю, как удалить значок из Dock. : - /

Есть идеи?

Ответы [ 6 ]

73 голосов
/ 07 марта 2009

Я думаю, что вы ищете LSUIElement в Info.plist

LSUIElement (Строка). Если для этого ключа установлено значение «1», Launch Services запускает приложение как приложение агента. Приложения агента не отображаются в Dock или в окне принудительного выхода. Хотя они обычно запускаются как фоновые приложения, при желании они могут выйти на передний план и представить пользовательский интерфейс.

См. Краткое обсуждение здесь о включении / выключении

48 голосов
/ 10 февраля 2012

Вы можете использовать так называемую Политику Активации:

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)

Это должно скрыть значок дока.

Смотри также

48 голосов
/ 14 января 2011

Чтобы сделать это, следуя рекомендациям Apple о том, чтобы не изменять комплекты приложений, и гарантировать, что приложения / (приложения Lion?) Mac App Store не будут нарушать свою подпись при модификации info.plist, вы можете установить LSUIElement в 1 по умолчанию затем при запуске приложения выполните:

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

, чтобы показать значок док-станции, или обойти это, если пользователь решил не хотеть значок.

Есть только один побочный эффект, меню приложения не отображается, пока оно не потеряет и не восстановит фокус.

Источник: Установка флажка Включение и выключение значка Dock

Лично я предпочитаю не устанавливать какие-либо опции Info.plist и использовать TransformProcessType(&psn, kProcessTransformToForegroundApplication) или TransformProcessType(&psn, kProcessTransformToUIElementApplication) в зависимости от настроек пользователя.

26 голосов
/ 24 мая 2011

В Xcode 4 оно отображается как «Приложение является агентом (UIElement)» и является логическим.

В контроллере Info.plist щелкните пустое место и выберите «Добавить строку» в меню. Тип "Приложение является агентом (UIElement)" Установите его ДА.

Чтобы сделать это необязательным, я добавил следующую строку в мой код (спасибо Valexa!)

 // hide/display dock icon
if (![[NSUserDefaults  standardUserDefaults] boolForKey:@"hideDockIcon"]) {
    //hide icon on Dock
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
} 
9 голосов
/ 09 октября 2014

Обновление для Swift: (Используйте оба способа, которые были представлены выше, они имеют одинаковый результат)

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
}
2 голосов
/ 10 марта 2009

Если вы хотите сделать это предпочтением пользователя, вы не можете использовать UIElement. UIElement находится в комплекте приложений, вы не должны редактировать ни один из файлов в комплекте приложений, так как это сделает недействительной подпись пакетов.

Лучшее решение, которое я нашел, основано на этой превосходной статье . Мое решение основано на комментарии Дэна. Короче говоря, нет никакого способа сделать это с Какао, но это возможно с небольшим количеством Углеродного кода.

В статье также предлагается создать вспомогательное приложение, которое будет обрабатывать только значок закрепления. Основное приложение запускается и убивает это приложение в зависимости от предпочтений пользователя. Этот подход кажется мне более надежным, чем использование кода Carbon, но я еще не пробовал.

...