【问题标题】:Make NSWindow Front But Not In Focus使 NSWindow 在前面但不在焦点上
【发布时间】:2011-06-19 02:24:35
【问题描述】:

我希望在所有其他窗口前面引入一个新的 NSWindow,但不让它成为焦点。

我可以通过以下方式使其突出显示在前面:

NSApplication *thisApp = [NSApplication sharedApplication]; [thisApp activateIgnoringOtherApps:YES]; [self makeKeyAndOrderFront:self];

关于如何使其显示在顶部但又不将焦点从另一个应用程序移开的任何线索?

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    不要使用makeKeyAndOrderFront:,而是尝试orderFront: (docs)

    【讨论】:

    • 我得到了相同的结果......“activateIgnoringOtherApps:YES”只是自动将焦点从所有其他应用程序中拉开。如果我删除该代码,那么新窗口只会出现在其他窗口后面,这很奇怪,因为文档说“orderFront:”应该按照我正在寻找的方式行事。
    • @ilollar 可以试试- (void)orderFrontRegardless
    • 嗯……也试过了,还是不行。从理论上讲,orderFront 和 orderFrontRegardless 的调用是针对特定应用程序显示堆栈内的窗口排序,而不是所有打开的窗口,对吧?
    • @ilollar 刚刚尝试过,orderFrontRegardless 似乎对我有用。您确定所有窗口级别都相同(即没有一个是 NSPanel 等)吗?
    • 那么 orderFrontRegardless 是把新窗口推到所有打开的窗口(包括来自其他应用程序的窗口)之上,还是仅仅推到项目本身的窗口之上?例如,我设置了一个计时器,在五秒后打开这个新窗口,当我运行我的应用程序时,我点击回到 XCode。当计时器触发时,新窗口出现在 XCode 后面,除非我“activateIgnoringOtherApps:” - 在这种情况下,当窗口弹出(在前面)时,焦点会从 XCode 中拉出。
    【解决方案2】:

    试试这样的:

    [window setLevel:NSScreenSaverWindowLevel + 1];
    [window orderFront:nil];
    

    这将在其他应用程序的窗口上方显示窗口,但不会使其处于活动状态。如果应用程序 B 是活动应用程序,则应用程序 A 中具有正常窗口级别的窗口不能显示在应用程序 B 的窗口前面。 (顺便说一句,这是有充分理由的)。

    请谨慎使用此方法。在许多情况下,它可能会违反人机界面准则。如果滥用,它可能会激怒用户。 (例如,在我刚才的测试中,窗口出现在我碰巧在 Safari 中看到的位置的正上方。事实上,它妨碍了我正在做的事情,但大胆地不 变成关键,让它变得更加烦人。如果它出现在我屏幕的一角,那可能就是另一回事了)。

    【讨论】:

    • 宾果游戏!那行得通。我同意你的担忧……如果不小心执行,这可能是一件非常危险的事情。我保证会小心:)
    • 我发现了“orderFrontRegardless”的问题并选择使用该方法,因为它似乎是实现此功能的更标准方法。但是,您的方法也很有用。感谢您的帮助!
    【解决方案3】:

    屏幕保护程序 +1 的订单前端方法和级别对我不起作用。不过,来自 The-Kenny 的 This answer 做到了:

    [yourPanel setLevel:kCGMaximumWindowLevel];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2016-12-17
      • 2011-06-14
      相关资源
      最近更新 更多