9

我需要在第三方应用程序上方显示一个窗口(没有标题栏),而我的窗口没有获得焦点。

我试过使用NSPanel和设置启用非激活,但这没有帮助。

我试过orderFront:self了,但这也没有帮助。

我总是需要添加[NSApp activateIgnoringOtherApps:YES];,因为否则窗口不会显示。

我在这里有一个用于此功能的示例项目:http:
//users.telenet.be/prullen/TopW2.zip

UIElement在应用程序的 plist 文件中设置为true,因此没有停靠。您可以通过同时按下来激活窗口ALT + SPACE。你会看到它下面的应用失去了焦点。关于如何解决这个问题的任何想法?我见过其他应用程序这样做,所以我知道这是可能的。

编辑:这是到目前为止的代码。请记住,该窗口是一个非激活的 NSPanel。我仍然需要最后NSApp activateIgnoringOtherApps一行,否则它不会显示。但这当然会使窗口成为活动窗口。

 _windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];

    [[_windowController window] setLevel:NSNormalWindowLevel+1];
    [[_windowController window] orderFrontRegardless];

    [_windowController showWindow:self];

   [NSApp activateIgnoringOtherApps:YES];

我还继承了 NSPanel 并添加了两种方法:

- (BOOL)canBecomeKeyWindow
{
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

编辑:好的,取消选中 setHidesOnDeactivate 可以解决此问题,但现在窗口将永远不会隐藏。当用户按下它下面的应用程序或切换到另一个应用程序时,我需要它隐藏。

编辑2:好的,这似乎解决了上述问题:

- (void)awakeFromNib
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideWindow) name:NSWindowDidResignKeyNotification object:nil];
}
- (void)hideWindow {
    [self setHidesOnDeactivate:YES];
}

不知道有没有更好的办法。

对于那些想知道如何显示窗口的人:

    [[_windowController window] setLevel:NSPopUpMenuWindowLevel];
    [[_windowController window] orderFrontRegardless];
    [[_windowController window] makeKeyWindow];

    [_windowController showWindow:self];
4

2 回答 2

4

其中任何一个都可以解决问题:

  • 用于-[NSWindow orderFrontRegardless]在不激活相应应用程序的情况下将正常级别的窗口置于前面,或
  • 用于-[NSWindow setLevel:]将窗口级别增加到高于NSNormalWindowLevel
于 2013-02-26T00:45:23.610 回答
0

不要从@puzzle 的有用答案中删除,但听起来您的问题与使用 anNSPanel而不是NSWindow.

“面板如何工作”文档说:

  • 屏幕面板(警报对话框除外)在应用程序未处于活动状态时从屏幕上移除,并在应用程序再次变为活动状态时恢复。这减少了屏幕混乱。
  • 具体来说, hidesOnDeactivate 方法的 NSWindow 实现返回 NO,但同一方法的 NSPanel 实现返回 YES。

因此,也许您可​​以覆盖hidesOnDeactivate以返回 NO,或更改为NSWindow

于 2013-02-26T19:29:07.097 回答