显示窗口而不激活(将应用程序保持在其下方)

时间:2013-02-25 22:09:58

标签: objective-c cocoa nsview nswindow nswindowcontroller

我需要在第三方应用程序上方显示一个窗口(没有标题栏)而窗口没有关注。

我尝试使用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];

2 个答案:

答案 0 :(得分:4)

其中任何一个都应该做到这一点:

  • 使用-[NSWindow orderFrontRegardless]在不激活相应应用的情况下获得正面水平窗口,或
  • 使用-[NSWindow setLevel:]将窗口级别提高到高于NSNormalWindowLevel
  • 的级别

答案 1 :(得分:1)

不要忘记@ puzzle的有用答案,但听起来您的问题与使用NSPanel而不是NSWindow有关。

“小组工作原理”文档说:

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

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