Objective c 在不激活的情况下显示窗口(保持其下方的应用程序处于活动状态)

Objective c 在不激活的情况下显示窗口(保持其下方的应用程序处于活动状态),objective-c,cocoa,nsview,nswindow,nswindowcontroller,Objective C,Cocoa,Nsview,Nswindow,Nswindowcontroller,我需要显示一个窗口(没有标题栏)以上的第三方应用程序,而我的窗口没有采取重点 我尝试过使用NSPanel并设置为启用非激活,但没有帮助 我试过orderFront:self,但也没用 我总是需要添加[NSApp activateIgnoringOtherApps:YES]因为窗口不会以其他方式显示 我这里有一个用于此功能的示例项目: UIElement在应用程序的plist文件中设置为true,因此没有停靠。您可以同时按ALT+SPACE激活该窗口。你会看到下面的应用程序失去了焦点。有没有关于

我需要显示一个窗口(没有标题栏)以上的第三方应用程序,而我的窗口没有采取重点

我尝试过使用
NSPanel
并设置为启用非激活,但没有帮助

我试过
orderFront:self
,但也没用

我总是需要添加
[NSApp activateIgnoringOtherApps:YES]因为窗口不会以其他方式显示

我这里有一个用于此功能的示例项目:

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;
}
编辑:好的,取消选中SetHideSondActivate可以修复这个问题,但是现在窗口将永远不会隐藏。我需要它隐藏当用户按下它下面的应用程序或切换到另一个应用程序

编辑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 orderfrontnothing]
    在不激活相应应用程序的情况下,将普通级别的窗口设置到前端,或者
  • 使用
    -[NSWindow setLevel:
    将窗口级别提高到高于
    NSNormalWindowLevel

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

“面板如何工作”文档中说:

  • 当应用程序未激活时,屏幕上的面板(警报对话框除外)将从屏幕上删除,当应用程序再次激活时,屏幕上的面板将恢复。这减少了屏幕的混乱
  • 具体来说,hidesOnDeactivate方法的NSWindow实现返回NO,但同一方法的NSPanel实现返回YES

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

谢谢,不幸的是,这仍然不起作用。我仍然需要添加activateIgnoringOtherApps:true调用,否则它不会显示。当然,这个调用使它成为活动窗口。@Wesley取消选中NIB中面板的“隐藏在停用状态”。谢谢,为什么我没想到呢?该选项,再加上OrderFrontDistribution和setLevel,最终使其起作用。非常感谢。你能告诉我怎么把窗户藏起来吗?因为我确实希望在用户单击其下方的应用程序(或切换到另一个应用程序)时将其隐藏。如果您希望在用户实际与您的窗口交互后执行此操作,将其设置为键(然后单击其他位置),则使用NSWindowDelegate应该可以。当您收到
windowDidResignKey:
消息时,请关闭/隐藏窗口。我认为问题出在NIB中,HIDEONDEACTIVE已在那里选中。我已取消选中hide on DEACTIVE,但现在面板从未隐藏。不是当我点击它下面的应用程序时,也不是当我切换到另一个应用程序时。有什么想法吗?