Как скрыть значок док-станции


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

какие идеи?

6 53

6 ответов:

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

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

смотрите короткую дискуссию здесь о превращении его вкл/выкл

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

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

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

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

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

лично я предпочитаю не устанавливать никакой информации.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)

Это должно скрыть иконку в доке.

см. также

в Xcode 4 он отображается как" приложение является агентом (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);
} 

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

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

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