Вопрос

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

Есть идеи?

Это было полезно?

Решение

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

  

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

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

Другие советы

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

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

чтобы показать его значок в доке, или пропустите его, если пользователь решил не хотеть значок.

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

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

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

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

Цель-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];

Свифт 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)

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

Смотрите также

В 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);
} 

Обновление для 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
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top