Как скрыть значок док-станции
Я хочу сделать предпочтение для скрытия значка док-станции и отображения NSStatusItem
.
Я могу создать StatusItem, но я не знаю, как удалить значок из Dock. : -/
какие идеи?
6 ответов:
Я думаю, что вы ищете
LSUIElement
в инфо.файл plistLSUIElement (Строку). Если этот ключ имеет значение "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 находится в пакете приложений вы не должны редактировать ни один из файлов в пакете приложений, так как это приведет к недействительности подписи пакетов.
лучшее решение, которое я нашел, основано на Это отличная статья . Мое решение основано на комментарии Дэна. Короче говоря, нет никакого способа сделать это с какао, но это возможно с небольшим количеством углеродного кода.
статьи также предлагается сделать вспомогательное приложение, которое обрабатывает значок док-станции исключительно. Затем основное приложение запускается и убивает это приложение в зависимости от предпочтений пользователей. Этот подход кажется мне более надежным, чем использование кода углерода, но я еще не пробовал его.