我需要在第三方应用程序上方显示一个窗口(没有标题栏),而我的窗口没有获得焦点。
我试过使用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];