Cocoa/Objective-C - 具有文本输入的子窗口,主窗口不会变为非事件状态

标签 cocoa macos nswindow textinput spotlight

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

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

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

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

  • 为我的主应用程序子类化 NSWindow 并覆盖 isKeyWindow这样,只有当应用程序不再是用户焦点(而不是窗口)时,它才会丢失键。这产生了意想不到的效果,与子窗口的按键状态发生冲突,并对键盘输入产生非常奇怪的影响(某些按键未被捕获,例如删除)
  • 创建 View 而不是窗口。不起作用,因为 this问题——现在你无法在 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 没有达到目的。没有想法。

最佳答案

你想要的是一个可以变成key window的窗口但不能成为main window 。您可以自己实现这样的类,但这基本上就是 NSPanel 的用途,因此您可以先尝试一下。

关于Cocoa/Objective-C - 具有文本输入的子窗口,主窗口不会变为非事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2940091/

相关文章:

objective-c - 仅适用于文件夹的 Cocoa 查找器菜单项

macos - NSBox 和自动布局

cocoa - 子类化 NSWindow 悬停调整大小

macos - Cocoa - Mac 操作系统上的 webview 关闭和窗口关闭

cocoa - 如果 OS X Lion 将重新打开文档,则不要打开无标题文件

swift - OS X 上的 SystemStatusBar statusItem 标题被缩短

objective-c - NSOperationQueue 出现非常奇怪的错误

macos - 如何为 X11 应用程序(例如 xmgrace)设置默认启动窗口大小

macos - 在 OSX 上加载 OpenGL 4.1 上下文

objective-c - 如何让 OS X 设置 NSWindow 的初始位置