2009-03-06 27 views
50

Chcę wybrać opcję ukrywania ikony Docku i pokazania numeru NSStatusItem. Mogę utworzyć StatusItem, ale nie wiem, jak usunąć ikonę z Docku. : -/Jak ukryć ikonę Docku

Wszelkie pomysły?

+0

jeśli aplikacja jest oparta na Qt5, trzeba także ustawić envvar 'QT_MAC_DISABLE_FOREGROUND_APPLICATION_TRANSFORM' –

Odpowiedz

63

myślę, że szukasz LSUIElement w Info.plist

LSUIElement (String). Jeśli ten klucz jest ustawiony na "1", usługi uruchamiania uruchamiają aplikację jako aplikację agenta. Aplikacje agenta nie pojawiają się w oknie dokowania lub w oknie zamykania. Chociaż zazwyczaj działają jako aplikacje działające w tle, mogą przejść na pierwszy plan, aby przedstawić interfejs użytkownika, jeśli jest to pożądane.

Zobacz krótką dyskusję here o włączał/off

2

Jeśli chcesz, aby to preferencje użytkownika, a następnie nie można używać UIElement. UIElement znajduje się w pakiecie aplikacji, nie należy edytować żadnego z plików w pakiecie aplikacji, ponieważ spowoduje to unieważnienie podpisu pakietu.

Najlepsze rozwiązanie, jakie znalazłem, oparte jest na this excellent article. Moje rozwiązanie opiera się na komentarzu Dana. Krótko mówiąc, nie ma sposobu, aby to zrobić z kakao, ale jest to możliwe dzięki odrobinie kodu węglowego.

Artykuł sugeruje również wykonanie aplikacji pomocniczej, która obsługuje wyłącznie ikonę stacji dokującej. Następnie główna aplikacja uruchamia się i zabija tę aplikację w zależności od preferencji użytkowników. Takie podejście wydaje mi się bardziej wiarygodne niż użycie kodu węglowego, ale jeszcze go nie wypróbowałem.

43

Aby zrobić to, przestrzegając wytycznych Apple dotyczących niezmodyfikowania pakietów aplikacji i aby zagwarantować, że aplikacje w App Store/(aplikacje Lion?) Nie będą miały podpisu uszkodzonego przez modyfikację info.plist, można ustawić LSUIElement na 1 przez domyślnie wtedy, gdy aplikacja się uruchamia, wykonaj:

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

, aby pokazać ikonę dokowania, lub pomiń tę opcję, jeśli użytkownik nie chce tej ikony.

Jest tylko jeden efekt uboczny, menu aplikacji nie jest wyświetlane, dopóki nie straci i odzyska ostrość.

Źródło: Making a Checkbox Toggle The Dock Icon On and Off

Osobiście wolę nie ustawienie dowolnej opcji Info.plist i używać TransformProcessType(&psn, kProcessTransformToForegroundApplication) lub TransformProcessType(&psn, kProcessTransformToUIElementApplication) na podstawie tego, co jest ustawieniem użytkownika.

+0

dzięki! Właśnie tego szukałem! – MrMage

+0

Świetna rada! Dzięki! Zawsze będziesz chciał ukryć ikonę Dock w ten sposób, aby upewnić się, że podpisana aplikacja działa. – Form

+1

Rozwiązania wywodzące się z tej strony nie pozwalają na aplikację, która * faktycznie chce * być TAKĄ LUZEM (tak jak w przypadku, nie ma paska menu itp.). Przełączenie procesu w ten sposób spowoduje wyświetlenie menu zgodnie z odpowiedzią. Z pewnością szanuję, że jest to najbliższa odpowiedź na tę pominiętą funkcjonalność, ale nie jest to precyzyjne rozwiązanie. Mówię użytkownikom, aby ręcznie dodali aplikację do Docku, jeśli chcą mieć tam ikonę. – SG1

25

W Xcode 4 jest pokazane jako "Aplikacja jest agentem (UIElement)" i jest typu Boolean.

w twojej Info.plist kontrola kliknij na pustą przestrzeń i wybierz „Dodaj wiersz” z menu typu „Aplikacja jest środkiem (UIElement)” Set to TAK.

ABY uczynić to opcjonalnym, dodałem następujący wiersz do mojego kodu (dzięki Valexa!)

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

motywowane od here, można zrobić:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory]; 

lub

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited]; 

ten powinien ukryć ikonę Dock. Zobacz dokumentację na temat here na temat NSApplicationActivationPolicy.

Zobacz także powiązane pytanie "Start a GUI process in Mac OS X without dock icon".

+2

To zdecydowanie najbardziej eleganckie rozwiązanie. Działa świetnie. – codingFriend1

+1

+1. 'NSApplicationActivationPolicyAccessory' w rzeczywistości pozwala na wyświetlenie głównego menu. –

+1

Z dokumentacji firmy Apple: Obecnie NSApplicationActivationPolicyNone i NSApplicationActivationPolicyAccessory można zmienić na NSApplicationActivationPolicyRegular, ale inne modyfikacje nie są obsługiwane. –

9

Aktualizacja Swift: (Użyj obie strony zostały przedstawione powyżej, mają ten sam wynik)

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 
}