将 NSWindow 的焦点设置在顶部,即使更改虚拟桌面也是如此

Set focus of NSWindow on top, even if changing of virtual desk

我正在做一个应用程序,它包括在一定时间后提出问题,用户不能再做任何事情,除非他回答问题,我已经设法维护 window通过设置 9999 级别始终位于顶部:

[_idleWindow setLevel:9999];

我想知道是否有办法避免在 window 打开时更改虚拟桌面,或者在更改虚拟桌面时再次聚焦 window。

查看 setCollectionBehavior:

[_idleWindow setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace|NSWindowCollectionBehaviorTransient|NSWindowCollectionBehaviorFullScreenDisallowsTiling|NSWindowCollectionBehaviorFullScreenAuxiliary];

可能会成功。

此外,如果您可以使用 NSPanel 而不是 NSWindow,则可以添加样式掩码:NSWindowStyleMaskNonactivatingPanel 以提供 window 键状态,即使您的应用未处于活动状态。 (你需要在 NSPanel 子类中实现 canBecomeKeyWindow

经过对 Google 的一些研究,我在另一个 Whosebug post 上找到了解决方案。

解决方案:

You need to add this code either in your xib / storyboard, either in your NSWindowController subclass -windowDidLoad method, either in your designated initialiser of your NSWindow subclass :

- (void) awakeFromNib { 
    [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces]; //this was the one that worked for me
}
OR

- (id)initWithContentRect:(NSRect)contentRect
                styleMask:(NSUInteger)styleMask
                  backing:(NSBackingStoreType)bufferingType
                    defer:(BOOL)flag {
    if (self = [super initWithContentRect:contentRect styleMask:styleMask  backing:bufferingType defer:flag]) {
        [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
    }
    return self;
}
OR if you have a NSWindowController

- (void)windowDidLoad {
    [super windowDidLoad];

    [[self window] setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}
OR Edit the nib file and add this behaviour to your window in XCode.

致谢:Stefan Szekeres