【问题标题】:Making NSBordlessWindow key and active when main application window is not active当主应用程序窗口不活动时,使 NSBordlessWindow 键和活动
【发布时间】:2014-09-20 15:48:12
【问题描述】:

我的应用程序中有一个自定义的NSBorderlessWindowMask 窗口,当用户点击某个热键时会显示该窗口。 这个窗口有一个`NSTextField,当窗口出现时它必须成为第一响应者。 此窗口不是主窗口,但可以从主窗口获取焦点。 我这样做是为了展示它并使其成为关键:

[self.myCustomWindow makeKeyAndOrderFront:sender];

然后设置第一响应者

[self.myTextField becomeFirstResponder];

当应用程序是最前面的应用程序时,一切都按预期工作, 但如果不是,窗口会出现,但不会成为键,我必须单击它才能激活。

我在 CustomWindow 类中重写:

- (BOOL)canBecomeKeyWindow {

    return YES;
}

可能是什么问题?

谢谢!

【问题讨论】:

    标签: osx-mavericks nswindow becomefirstresponder makekeyandordertofront nsborderlesswindowmask


    【解决方案1】:

    根据Cocoa Event Handling Guide,只有最前面的应用程序才能有主窗口和关键窗口状态:

    当应用程序同时显示主窗口和关键窗口时, 两个窗口的响应者链都可以参与一个动作 信息。如“窗口分层和窗口类型”中所述, 主窗口是最前面的文档或应用程序窗口。经常 主窗口也有关键状态,这意味着它们是当前焦点 的用户输入。但是一个主窗口可以有一个辅助窗口或面板 与之关联的,例如“查找”面板或显示的信息窗口 文档窗口中选择的详细信息。当这个二级 window 是用户输入的焦点,然后是关键窗口。

    我看不出有什么办法。

    编辑:同样来自Window Programming Guide:

    由于关键窗口属于活动应用程序,它的 突出显示的标题栏具有帮助显示的次要效果 哪个应用程序当前处于活动状态。关键窗口是最 在活动应用程序中突出标记的窗口,使其成为“关键” 在第二种意义上:它是用户关注的主要焦点 屏幕。

    【讨论】:

    • 但我不需要它成为主要的。我只是想让它成为关键。我只需要关注文本字段,因此当窗口从窗口变为时它成为第一响应者
    • @NavaCarmon 添加了来自 Apple 文档的另一个引用。关键窗口属于活动应用程序。我看不出这怎么能轻易改变。
    • 我尝试添加 [NSApp activateIgnoringOtherApps:YES] 之前将其设为密钥并且它可以工作。
    猜你喜欢
    • 2012-10-26
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2018-10-06
    相关资源
    最近更新 更多