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

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

какие идеи?

6 ответов


Я думаю, вы ищете LSUIElement в инфо.файл plist

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

см. краткое обсуждение здесь о повороте on/off


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

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

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

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

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

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


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

С

// 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)

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

см. также


в Xcode 4 он отображается как " Application is agent (UIElement)" и является логическим.

в вашей информации.plist control-нажмите на пустое место и выберите "Добавить строку" в меню Тип " приложение-агент (UIElement)" Установите его да.

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

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

Update for 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 находится в пакете приложений, вы не должны редактировать файлы в пакете приложений, так как это приведет к недействительности подписи пакетов.

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

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