如何隐藏Dock图标

pap*_*apr 61 macos cocoa icons dock lsuielement

我想隐藏Dock图标并显示一个NSStatusItem.我可以创建StatusItem但我不知道如何从Dock中删除图标.: - /

有任何想法吗?

epa*_*tel 75

我想你正在寻找LSUIElementInfo.plist中的内容

LSUIElement(String).如果此键设置为"1",则启动服务将应用程序作为代理应用程序运行.代理应用程序不会出现在Dock或强制退出窗口中.虽然它们通常作为后台应用程序运行,但如果需要,它们可以到前台呈现用户界面.

请参阅此处有关打开/关闭它的简短讨论

  • 链接已死。 (2认同)

Alb*_*ert 52

您可以使用所谓的激活策略:

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];
Run Code Online (Sandbox Code Playgroud)

斯威夫特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)
Run Code Online (Sandbox Code Playgroud)

这应该隐藏停靠图标.

也可以看看

  • 这绝对是最优雅的解决方案.完美的工作. (3认同)
  • 这在文档中显示应用程序图标并立即将其从扩展坞中删除。我不想在坞站中进行任何更改。任何提示。 (3认同)
  • +1。实际上,NSApplicationActivationPolicyAccessory允许主菜单显示。 (2认同)
  • 来自 Apple 文档:目前,NSApplicationActivationPolicyNone 和 NSApplicationActivationPolicyAccessory 可能会更改为 NSApplicationActivationPolicyRegular,但不支持其他修改。 (2认同)

val*_*exa 48

要遵守不修改应用程序包的Apple准则,并保证Mac App Store应用程序/(Lion应用程序?)不会通过info.plist修改打破其签名,您可以默认将LSUIElement设置为1,然后应用程序启动:

ProcessSerialNumber psn = { 0, kCurrentProcess };
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
Run Code Online (Sandbox Code Playgroud)

显示它的停靠图标,或者如果用户选择不想要图标则绕过它.

只有一个副作用,应用程序的菜单在丢失并重新获得焦点之前不会显示.

来源:制作复选框打开和关闭Dock图标

我个人不喜欢不设置任何Info.plist选项并使用TransformProcessType(&psn, kProcessTransformToForegroundApplication)TransformProcessType(&psn, kProcessTransformToUIElementApplication)基于用户设置.

  • 源自此代码路径的解决方案不允许*实际上希望*为 LSUIElement YES 的应用程序(例如,没有菜单栏等)。以这种方式切换过程将导致显示一个菜单,如答案中所述。我当然尊重这是最接近这个被忽视的功能的答案,但它不是一个精确的解决方案。我告诉用户如果他们想要一个图标,只需手动将应用程序添加到 Dock。 (2认同)

Tib*_*abo 26

在Xcode 4中,它显示为"Application is agent(UIElement)",它是布尔值.

在Info.plist控件中 - 单击一个空白区域并从菜单中选择"添加行"类型"应用程序是代理(UIElement)"将其设置为YES.

为了使它可选,我在代码中添加了以下行(感谢Valexa!)

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


Huy*_*yen 9

更新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
}
Run Code Online (Sandbox Code Playgroud)