可可把窗口放在前台

时间:2011-12-12 18:27:57

标签: objective-c macos cocoa user-interface layer

我正在构建一个在后台运行但有一个主窗口的Cocoa Mac应用程序。

为了让它在后台运行,我将“应用程序仅限背景”设置为“是”。

我制作了一个系统托盘:

system tray

如果您关闭主窗口,可以通过单击“打开”重新打开它。

然而,我有一些关于窗口分层的问题:

  • 当我启动应用程序时,主窗口会打开,但它会出现在后台,在我当时打开的任何其他窗口或应用程序的后面。
  • 单击“打开”不会将窗口置于前台。如果关闭它会正确打开它,但它会留在任何窗户后面。
  • 点击偏好或关于具有相同的问题。它打开了正确的窗口,但它出现在任何其他窗口后面。
  • 在我的主窗口上有一个文本字段。我可以点击它,光标闪烁,好像我准备打字一样。但是当我输入它实际上键入其他一些背景窗口!例如,如果我在后台打开TextWrangler,它将在那里键入而不是textfield ...

以下是我处理“开放”的代码:

- (IBAction)show:(id)sender {
    [NSApp activateIgnoringOtherApps:YES];
    [window makeKeyAndOrderFront:sender];   
}

请注意,如果我将“应用程序仅为后台”设置为“否”(这意味着我出现了停靠图标),则单击“打开”会使窗口按预期显示在前台。并且在文本字段中输入按预期工作。

2 个答案:

答案 0 :(得分:4)

我认为您希望将Application is agent (UIElement)设置为YES,而不仅仅是背景。背景仅适用于不希望用户看到的应用程序。

答案 1 :(得分:1)

仅背景(LSBackgroundOnly YES)适用于无面背景应用程序,附件(LSUIElement YES)适用于具有UI和状态菜单的背景应用程序(菜单附加/附件菜单/等等 - 名称更改...)。

附件不会出现在底座中,有标准菜单栏,或出现在Finder的强制退出对话框中。它可以是“活动的”,可以有关键窗口。

虽然如果在XIB中声明了MainMenu,但它没有标准的菜单栏(可能是一个bug),那么当它处于活动状态时它将响应关键快捷键。为避免这种情况,请确保您没有MainMenu或在您希望禁用快捷方式时使用[NSApp setMainMenu:nil]

整个背景/配件/应用/活动/等。区域不是很明确,准备好“有趣”......