如何在打开实用程序面板时激活窗口级别

问题描述 投票:0回答:1

我的应用程序由多个窗口组成,这些窗口都存在于 NSNormalWindowLevel。我最近添加了一个作为实用程序面板打开的新窗口(因此,NSFloatingWindowLevel)。该实用程序面板作为浮动窗口正确打开,并保持在其他窗口之上,我可以通过单击任何“正常”窗口来更改焦点,或者当我希望在实用程序面板上进行交互时再次单击该实用程序面板。

我遇到的问题是,我希望实用程序面板在打开时始终抓住焦点;我希望焦点保留在 NSNormalWindowLevel 的顶部窗口上,这样用户就不必单击顶部的“正常”窗口来继续在那里工作。

基本代码如下所示:

    storyBoard = [NSStoryboard storyboardWithName:@"UtilityPanel" bundle:nil];
    utilityPanelController = [storyBoard instantiateControllerWithIdentifier:@"Utility Panel"];

    [utilityPanelController showWindow:sender];

我尝试通过获取顶部窗口的引用并调用 orderFront 来强制顶部普通窗口位于前面:

    NSWindow *topWindow = [[NSApplication sharedApplication] keyWindow];
    [topWindow orderFront:nil];

但是实用程序面板仍然具有焦点,需要单击顶部窗口才能将焦点返回到原来的位置。我也尝试使用 orderFrontRegardless 得到相同的结果。

恰好 orderFront 和 orderFrontRegardless 都只对同一窗口级别的窗口进行操作,而这里的窗口处于不同级别。

我已经查看了窗口管理器,但尚未找到在打开实用程序面板时在代码中将焦点更改为特定窗口级别(例如,NSNormalWindowLevel)的方法。我错过了一些明显的事情吗?

谢谢!

objective-c nswindow nswindowcontroller window-management
1个回答
0
投票

NSGod在评论中提供的解决方案:

将变得KeyOnlyIfNeeded设置为YES。

© www.soinside.com 2019 - 2024. All rights reserved.