【问题标题】:Cocoa put window in the foreground可可将窗口放在前景中
【发布时间】:2011-12-12 18:27:57
【问题描述】:

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

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

我建了一个系统托盘:

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

但是,我对窗口的分层有一些问题:

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

这是我处理“打开”的代码:

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为您希望将Application is agent (UIElement) 设置为YES 而不仅仅是背景。背景仅适用于不打算对用户可见的应用程序。

    【讨论】:

      【解决方案2】:

      仅后台 (LSBackgroundOnly YES) 用于不露面的后台应用程序,附件 (LSUIElement YES) 用于具有 UI 和状态菜单(菜单额外/附件菜单/等 - 名称更改...)的后台应用程序。

      配件不会出现在扩展坞中,不会有标准菜单栏,也不会出现在 Finder 的强制退出对话框中。它可以是“活动的”并且可以有关键窗口。

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

      整个背景/附件/应用程序/活动/等。区域不完全明确,准备好“有趣”...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        相关资源
        最近更新 更多