我需要在第三方应用程序上方显示一个窗口(没有标题栏)而窗口没有关注。
我尝试使用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];
答案 0 :(得分:4)
其中任何一个都应该做到这一点:
-[NSWindow orderFrontRegardless]
在不激活相应应用的情况下获得正面水平窗口,或-[NSWindow setLevel:]
将窗口级别提高到高于NSNormalWindowLevel
答案 1 :(得分:1)
不要忘记@ puzzle的有用答案,但听起来您的问题与使用NSPanel
而不是NSWindow
有关。
“小组工作原理”文档说:
- 当应用程序未处于活动状态时,屏幕截图(警报对话框除外)将从屏幕上删除,并在应用程序再次激活时恢复。这可以减少屏幕混乱。
- 具体来说,hidesOnDeactivate方法的NSWindow实现返回NO,但同一方法的NSPanel实现返回YES。
因此,您可以覆盖hidesOnDeactivate
以返回NO,或更改为NSWindow