Wie man das Dock-Symbol verstecken
-
05-07-2019 - |
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?
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
- Antwort, der dieses anspornte: Wie eine Hilfsanwendung (LSUIElement) erstellen, die auch ein (abnehmbar) Dock-Symbol hat
- Dokumentation für
NSRunningApplicationActivationPolicy
. - Eine weitere Frage: "Starten Sie ein GUI-Prozess in Mac OS X ohne Dock-Symbol" .
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.