6

我需要在可可应用程序中生成一个悬停在我的主窗口上方的窗口。我希望这个主窗口允许用户在输入框中输入一些文本。一切都很好,直到文本输入框真正获得焦点。主窗口变为“停用”。这个窗口是无边界的,并且是一个稍微自定义的形状——我想它更像是一个悬停卡而不是其他任何东西。

基本上,我希望这个东西几乎可以像 Spotlight (Apple + Space) 一样工作——你可以输入文本,但这是一个辅助操作,在更大的 UX 的背景下,你不想要不和谐主窗口变灰(变为非活动状态)的效果。您会注意到,当您打开某个应用程序并处于焦点位置时,聚光灯不会导致该应用程序的窗口变为非活动状态。

出现这个问题是因为文本输入似乎需要子窗口成为关键窗口(它不会让您将光标放在文本输入字段中)。当它成为键时,主窗口变为非活动状态。

到目前为止,我已经尝试过:

  • 为我的主应用程序子类化 NSWindow 并覆盖isKeyWindow,这样它只会在应用程序不再是用户焦点(而不是窗口)时丢失密钥。这产生了与子窗口的键状态发生冲突并对键盘输入产生非常奇怪的影响(某些键未捕获,如删除)的意外影响
  • 创建视图而不是窗口。由于这个问题,它不起作用——这些天你不能在 Webkit WebView 上绘图。

任何 Cocoa/OSX 向导有什么想法吗?我对这个有点着迷了。痒痒的,抓不住。

编辑:还尝试在子窗口上覆盖以下内容。单击时,该窗口会使主应用程序窗口变为非活动状态。

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow {
    return NO;
}

编辑 2:在使用 NSMenu 一段时间后,我放弃了这种方法。然而,我似乎发现了一些东西。在 NSPanel 中有一个名为的窗口样式掩码:

NSNonactivatingPanelMask
The panel can receive keyboard input without activating the owning application.
Valid only for an instance of NSPanel or its subclasses; not valid for a window.

现在试试这个...

编辑 3: NSNonactivatingPanelMask 没有做到这一点。没有想法。

4

2 回答 2

1

What you want is a window that can become the key window but which cannot become the main window. You could implement such a class yourself, but this is basically what NSPanel is for, so you might try that first.

于 2010-05-30T20:21:01.590 回答
-1

我认为这可以帮助你:[self.childWindow makeKeyAndOrderFront:self];

于 2012-03-23T06:20:32.487 回答