显示窗口没有激活(让应用程序在它下面激活)

问题描述:

我需要显示一个窗口(没有标题栏)上方的第三方应用程序没有我的窗口焦点。显示窗口没有激活(让应用程序在它下面激活)

我曾尝试使用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
+0

感谢,可惜这仍然无法正常工作。我仍然需要添加activateIgnoringOtherApps:true调用,否则它不显示。那个电话当然会使它成为活跃的窗口。 – Wesley 2013-02-26 07:28:30

+2

@Wesley取消选中NIB面板中的“取消激活时隐藏”。 – puzzle 2013-02-26 22:19:26

+2

谢谢,我为什么没有想到这一点?这个选项,连同orderFrontRegardless和setLevel使它最终工作。谢谢! – Wesley 2013-02-27 07:39:12

不要从@ puzzle的有用答案中拿走,但它听起来像是您的问题与使用NSPanel而不是NSWindow有关。

“如何专家组的工作”文件说:

  • 荧幕面板,除了警告对话框,从屏幕上消失时,该应用程序是不活动的恢复,当应用程序再次变得活跃。这减少了屏幕杂乱。
  • 具体而言,hindOnDeactivate方法的NSWindow实现返回NO,但同一方法的NSPanel实现返回YES。

那么也许你可以重写hidesOnDeactivate返回NO,或改变NSWindow

+0

我认为问题出在NIB上,在那里检查hideOnDeactivate。 – puzzle 2013-02-26 22:20:06

+0

我没有选择隐藏在停用,但现在面板永远不会隐藏。不是当我点击它下面的应用程序,而不是当我切换到另一个应用程序。有任何想法吗? – Wesley 2013-02-27 09:29:17