如何隐藏Dock图标
我想优先select隐藏Dock图标并显示NSStatusItem
。 我可以创buildStatusItem,但我不知道如何从Dock中删除图标。 : – /
有任何想法吗?
我想你正在寻找Info.plist中的LSUIElement
LSUIElement(string)。 如果此项设置为“1”,则启动服务作为代理应用程序运行应用程序。 代理应用程序不会出现在Dock或“强制退出”窗口中。 虽然它们通常作为后台应用程序运行,但如果需要,它们可以前台呈现用户界面。
在这里查看关于打开/closures的简短讨论
要遵守苹果的指导方针,不要修改应用程序包,并保证Mac App Store应用程序/(Lion应用程序?)不会因info.plist修改而使其签名被破坏,您可以默认将LSUIElement设置为1,应用程序启动做:
ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToForegroundApplication);
显示它的停靠图标,或者如果用户select不需要该图标,则绕过该图标。
只有一个副作用,应用程序的菜单直到失去并重新获得焦点才显示出来。
来源: 制作checkbox切换停靠图标打开和closures
我个人更喜欢不设置任何Info.plist选项,并根据用户设置使用TransformProcessType(&psn, kProcessTransformToForegroundApplication)
或TransformProcessType(&psn, kProcessTransformToUIElementApplication)
。
受到这里的激励,你可以这样做:
[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
要么
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
这应该隐藏停靠栏图标。 有关NSApplicationActivationPolicy
一些文档,请参阅这里 。
另请参阅相关问题“在没有停靠图标的Mac OS X中启动GUI进程” 。
在Xcode 4中显示为“应用程序是代理(UIElement)”,它是布尔型的。
在你的Info.plist控件中点击一个空白的空白,然后从菜单中select“添加行”types“应用程序是代理(UIElement)”设置为YES。
为了使其可选,我添加了以下行代码(感谢Valexa!)
// hide/display dock icon if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hideDockIcon"]) { //hide icon on Dock ProcessSerialNumber psn = { 0, kCurrentProcess }; TransformProcessType(&psn, kProcessTransformToForegroundApplication); }
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驻留在应用程序包中,因此不应该编辑应用程序包中的任何文件,因为这会使包签名无效。
我发现的最好的解决scheme是基于这个优秀的文章 。 我的解决scheme是基于Dan的评论。 简而言之,Cocoa没有办法做到这一点,但是可以用一点点的Carbon代码。
文章还build议制作一个帮助程序,专门处理停靠栏图标。 主应用程序然后启动并杀死这个应用程序取决于用户的喜好。 这种方法让我觉得比使用Carbon代码更强大,但是我还没有尝试过。