如何将另一个Cocoa应用程序窗口置于前台

5
我开发了一款Mac OS应用程序。这个应用程序包含一个主窗口和一个菜单栏帮助程序。
在菜单栏帮助程序中有一个名为“显示主应用程序”的菜单项。如果我点击这个菜单项,菜单栏帮助程序应该启动主应用程序,如果主应用程序没有启动的话。而且,如果主应用程序隐藏在Dock中或其主窗口被关闭,菜单栏帮助程序应该将主应用程序置于最前面。
我知道如何启动主应用程序,但我不知道如何实现重新激活功能。我的代码如下。
let apps = NSRunningApplication.runningApplications(withBundleIdentifier: "com.xxx.yyy")
if let mainApp = apps.first {
       mainApp.activate(options: [ .activateIgnoringOtherApps ])
}

在主应用程序刚启动并隐藏在 Dock 中时,似乎 activate 方法没有任何作用。我注意到主应用程序实际上已被激活,因为主菜单栏已更改为主应用程序的主菜单。但其 AppDelegate 类的 "applicationShouldHandleReopen" 方法未被调用。因此,主窗口无法被置于最前。

我应该如何让它正常工作?


你成功完成了吗?我正在尝试激活在Dock中的应用程序窗口。 - Marie Dm
1个回答

0
无论目标应用程序是否已启动,只需调用即可。
NSWorkspace.shared().launchApplication("xxxx")

它运行正常。


1
为什么要点踩而不留言呢?还有其他人能否在这里澄清一下吗?当我们对某些“应该”有效的东西进行负面评价时,这并不真正有助于社区。 - Shaun Wilson
1
@ShaunWilson 我同意。 - morphinewan
1
经过一些测试,如果应用程序已经运行并且有一个窗口遮挡该应用程序,则此解决方法无法将目标应用程序置于最前。我们的解决方案之一是暂停此逻辑,直到删除了任何遮挡窗口。我们需要这样做,以便另一个应用程序可以通过其主窗口在z-order的顶部(并且还处于“活动”状态)将其自己的面板置于最上层。我们最终解决方案的一部分包括使用来自[SO#2333078](https://dev59.com/1nE95IYBdhLWcg3wY85l?rq=1)的`activateIgnoringOtherApps`。 - Shaun Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接