Как скрыть значок 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 исключительно. Основное приложение затем запускается и убивает это приложение в зависимости от предпочтений пользователей. Этот подход кажется мне более надежным, чем использование углеродного кода, но я еще не пробовал его.