显示窗口没有激活(让应用程序在它下面激活)
问题描述:
我需要显示一个窗口(没有标题栏)上方的第三方应用程序没有我的窗口焦点。显示窗口没有激活(让应用程序在它下面激活)
我曾尝试使用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;
}
编辑:OK,取消选中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];
答
无论这些人应该做的伎俩:
- 使用
-[NSWindow orderFrontRegardless]
得到正常水平窗口前而不激活相应的应用程序,或者 - 使用
-[NSWindow setLevel:]
可将窗口级别提高到高于NSNormalWindowLevel
答
不要从@ puzzle的有用答案中拿走,但它听起来像是您的问题与使用NSPanel
而不是NSWindow
有关。
“如何专家组的工作”文件说:
- 荧幕面板,除了警告对话框,从屏幕上消失时,该应用程序是不活动的恢复,当应用程序再次变得活跃。这减少了屏幕杂乱。
- 具体而言,hindOnDeactivate方法的NSWindow实现返回NO,但同一方法的NSPanel实现返回YES。
那么也许你可以重写hidesOnDeactivate
返回NO,或改变NSWindow
感谢,可惜这仍然无法正常工作。我仍然需要添加activateIgnoringOtherApps:true调用,否则它不显示。那个电话当然会使它成为活跃的窗口。 – Wesley 2013-02-26 07:28:30
@Wesley取消选中NIB面板中的“取消激活时隐藏”。 – puzzle 2013-02-26 22:19:26
谢谢,我为什么没有想到这一点?这个选项,连同orderFrontRegardless和setLevel使它最终工作。谢谢! – Wesley 2013-02-27 07:39:12