在没有停靠栏图标的Mac OS X中启动GUI过程

Dav*_*eer 4 c++ macos qt multithreading

我有一个通常使用标准图形界面运行的应用程序.但是,对于某些长时间运行的任务,它会生成以"脚本模式"运行的同一应用程序的其他进程,我将从父进程控制它.一切都很好,除了对于每个子进程我得到另一个停靠图标弹出一两秒然后消失.

有没有一种方式来运行的应用程序有时不显示在码头上了应用程序图标?我无法编辑info.plist或其他任何东西,因为通常我想要停靠图标.必须能够通过更改进程上的属性或通过命令行参数来设置该选项.我完全控制了应用程序的源代码.它是用C++(Qt)编写的,但是针对本机Cocoa库的解决方案很好.

如果我把这个代码放到一个单独的应用程序中,它会导致重复,所以我宁愿保持原样.我不能在后台线程中运行长时间运行的任务,因为它们正在做必须在GUI线程中完成的事情.(在Qt中,您无法在后台线程上可靠地使用字体,像素图或将SVG内容渲染到QGraphicsScene上.)

有解决方案吗

Alb*_*ert 8

这里激励,您可以:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
Run Code Online (Sandbox Code Playgroud)

要么

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
Run Code Online (Sandbox Code Playgroud)

这应该隐藏停靠图标.见这里关于一些文档NSApplicationActivationPolicy.

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

另请参阅相关问题"如何隐藏Dock图标".


如果你想避免在开头就弹出停靠图标,你可以这样做:

import AppKit
info = AppKit.NSBundle.mainBundle().infoDictionary()
info["LSBackgroundOnly"] = "1"
Run Code Online (Sandbox Code Playgroud)

  • 当我将 activationpolicy 设置为 Accessory 时,所有窗口都将关闭。你怎么能避免这种情况? (2认同)