Как скрыть значок в Dock
-
05-07-2019 - |
Вопрос
Я хочу скрыть значок 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, но я еще не пробовал.