Frage

Ich möchte zum Verstecken des Dock-Symbol eine Präferenz machen und eine NSStatusItem zeigt. Ich kann die StatusItem schaffen, aber ich weiß nicht, wie das Symbol von Dock zu entfernen. : - /

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich glaube, Sie für die LSUIElement in dem Info.plist suchen

  

LSUIElement (String). Wenn dieser Schlüssel auf „1“ gesetzt ist, läuft Launch Services die Anwendung als Mittel Anwendung. Agent-Anwendungen erscheinen nicht im Dock oder in der Sofort beenden Fenster. Obwohl sie in der Regel als Hintergrundanwendungen ausgeführt werden, können sie in den Vordergrund eine Benutzeroberfläche zu präsentieren, falls gewünscht.

Hier finden Sie eine kurze Diskussion hier über Drehen Ein / aus

Andere Tipps

Um es zu tun, während bleibend zu den Apple-Richtlinien nicht Anwendungspakete zu modifizieren und zu gewährleisten, dass Mac App Store apps / (Lion apps?) Nicht ihre Unterschrift durch info.plist Änderung gebrochen haben Sie LSUIElement standardmäßig auf 1 festlegen dann, wenn die Anwendung gestartet tun:

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

zu zeigen, es ist Dock-Symbol, oder Bypass dies, wenn der Benutzer wählte das Symbol nicht wollen.

Es gibt nur einen Nebeneffekt, das Menü der Anwendung nicht, bis es Verluste gezeigt und gewinnt konzentrieren.

Quelle: Ein Kästchen zum Ankreuzen Toggle Das Dock-Symbol Ein und Aus

Persönlich Einstellung Ich ziehe keine Info.plist Option und verwenden TransformProcessType(&psn, kProcessTransformToForegroundApplication) oder TransformProcessType(&psn, kProcessTransformToUIElementApplication) auf das, was die Benutzereinstellung.

Sie können mit was Aktivierungsrichtlinie genannt wird:

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)

Dies sollte das Dock-Symbol verbergen.

Siehe auch

In Xcode 4 wird gezeigt, wie "Die Anwendung ist Mittel (UIElement)" und es ist Boolean.

In Ihrem Info.plist Control-Klick auf einen leeren Raum und wählen Sie „Zeile hinzufügen“ aus dem Menü Geben Sie "Die Anwendung ist Agent (UIElement)" Stellen Sie es ja.

Um es optional ich die folgende Zeile in meinen Code (dank Valexa!) Hinzugefügt

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

Update für Swift: (Verwenden Sie beide Weisen oben dargestellt wurde, sie das gleiche Ergebnis haben)

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
}

Wenn Sie eine Benutzereinstellung vornehmen möchten, dann können Sie nicht UIElement verwenden. UIElement liegt in der Anwendung bündeln Sie alle Dateien in dem App-Bundle nicht ändern sollten, da dies das Bündel Signatur ungültig wird.

Die beste Lösung, die ich gefunden habe, basiert auf diesen ausgezeichneten Artikel . Meine Lösung wird auf den Kommentar von Dan basiert. Kurz gesagt, gibt es keine Möglichkeit, dies mit Cocoa zu tun, aber es ist möglich, mit einem klein wenig von Carbon-Code.

Der Artikel schlägt auch einen Helfer-App machen, die das Dock-Icon ausschließlich verarbeitet. Der Haupt-App startet dann und tötet diese App auf den Benutzer-Einstellungen abhängig. Dieser Ansatz scheint mir als robuster als die Carbon-Code, aber ich habe es noch nicht ausprobiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top