我有一个通常使用标准图形界面运行的应用程序。但是,对于某些长时间运行的任务,它会生成以“脚本模式”运行的同一应用程序的其他进程,我将从父进程控制它。一切都很好,除了对于每个子进程我得到另一个停靠图标弹出一两秒然后消失。
有没有办法在没有应用程序图标出现在Dock上的情况下运行应用程序有时?我无法编辑info.plist或任何东西,因为通常我想要停靠图标。必须能够通过更改进程上的属性或通过命令行参数来设置该选项。我完全控制了应用程序的源代码。它是用C ++(Qt)编写的,但是针对本机Cocoa库的解决方案很好。
如果我将此代码放入单独的应用程序中,则会导致严重的重复,因此我宁愿保持原样。我不能在后台线程中运行长时间运行的任务,因为它们正在做必须在GUI线程中完成的事情。 (在Qt中,您无法在后台线程上可靠地使用字体,像素图或将SVG内容渲染到QGraphicsScene上。)
任何解决方案?
答案 0 :(得分:8)
来自here的动机,您可以这样做:
[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
或
[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
这应隐藏停靠栏图标。有关NSApplicationActivationPolicy
的一些文档,请参阅here。
在Python中,隐藏停靠图标的代码是:
# https://stackoverflow.com/a/9220857/133374
import AppKit
# https://developer.apple.com/library/mac/#documentation/AppKit/Reference/NSRunningApplication_Class/Reference/Reference.html
NSApplicationActivationPolicyRegular = 0
NSApplicationActivationPolicyAccessory = 1
NSApplicationActivationPolicyProhibited = 2
AppKit.NSApp.setActivationPolicy_(NSApplicationActivationPolicyProhibited)
另请参阅相关问题"How to hide the Dock icon"。
如果你想避免在开头就弹出停靠栏图标,你可以这样做:
import AppKit
info = AppKit.NSBundle.mainBundle().infoDictionary()
info["LSBackgroundOnly"] = "1"
答案 1 :(得分:2)
import AppKit
info = AppKit.NSBundle.mainBundle().infoDictionary()
info["LSBackgroundOnly"] = "1"
此代码适用于我的非GUI背景python脚本。