我有一个 Qt 应用程序(出于此问题范围之外的原因)将其每个窗口作为单独的进程启动。
这工作正常,但在 MacOS/X 下,每个窗口/进程在 Dock 中显示为单独的条目。因此,当用户打开十几个窗口时,Docks 中有十几个相同的图标,这不是很有帮助(因为很难分辨哪个是哪个,并且图标开始变小)。
有没有办法告诉 Dock 将所有这些进程组合在一个 Dock 图标下?(一个特定于 Mac 的 API 就可以了)
我有一个 Qt 应用程序(出于此问题范围之外的原因)将其每个窗口作为单独的进程启动。
这工作正常,但在 MacOS/X 下,每个窗口/进程在 Dock 中显示为单独的条目。因此,当用户打开十几个窗口时,Docks 中有十几个相同的图标,这不是很有帮助(因为很难分辨哪个是哪个,并且图标开始变小)。
有没有办法告诉 Dock 将所有这些进程组合在一个 Dock 图标下?(一个特定于 Mac 的 API 就可以了)
您可以使用以下代码段隐藏非活动进程的 Dock 磁贴:
- (void)applicationWillResignActive:(NSNotification *)notification
{
ProcessSerialNumber psn = {0, kCurrentProcess};
TransformProcessType(&psn, kProcessTransformToBackgroundApplication);
if([self.window isVisible])
{
[self.window performSelector:@selector(orderFrontRegardless) withObject:nil afterDelay:0.05];
}
}
- (void)applicationWillBecomeActive:(NSNotification *)notification
{
ProcessSerialNumber psn = {0, kCurrentProcess};
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
SetFrontProcessWithOptions(&psn, kSetFrontProcessCausedByUser);
}
只需将上面的代码添加到您的应用程序委托中,当进程退出活动时,应用程序的 Dock 图标就会消失。
要在进程转换为 UIElement 应用程序后保持窗口可见,请发送orderFrontRegardless
消息。(我知道这很 hacky - 但这一定是非标准窗口/进程处理的代价)
可能您还应该维护一个 Dock 菜单,允许您的用户选择隐藏的窗口。
您可以从“主”应用程序中动态添加条目。详细信息可以在Dock Tile 编程指南的“使用应用程序代理动态添加菜单项”部分中找到。
更新:
我稍微更改了上面的代码示例,因为以前的方法在重新激活应用程序后导致主菜单无响应。
打电话QSystemTrayIcon::hide()
。
如果这不起作用,您可以尝试以下方法:
使用NSApplication
的setActivationPolicy:
方法
方式一:[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
方式二:[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
或者
使用 LSUIElement
(LSUIElement=1)
.
你也可以把它放在你的 pfile 中:<key>LSUIElement</key> <string>1</string>
或者让 Qt为你做。
Qt 论坛上
也有一些关于OSX 菜单的讨论。此外,您可以尝试使用QFocusEvent来检查应用何时失去/获得焦点,然后相应地更新菜单。
来源