Подтвердить что ты не робот

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Источник: Создание флажка Включить и отключить значок док-станции

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

Ответ 3

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

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)

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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