【问题标题】:Disable application activation on window click在窗口单击时禁用应用程序激活
【发布时间】:2012-02-11 19:25:53
【问题描述】:

在我的 Cocoa/Objective-C 应用程序中,我有一个“始终在顶部”浮动的实用程序面板,即使在我的应用程序未处于活动状态时也可以访问。我正在尝试禁用“当用户单击该面板时切换到我的应用程序”。

我想要实现的行为类似于 OSX 的键盘查看器(这也是一个从不激活面板),因此在单击我的应用程序面板后,其他一些应用程序仍然处于活动状态。即 Safari 在使用键盘查看器键入地址时保持活动状态。甚至第三方屏幕键盘也具有此功能(例如来自 CORALLO Software 的键盘),这意味着此行为并非保留仅限系统。

我在搞乱NSApplicationActivationPolicy,但没有积极的结果。我应该往哪个方向走?

【问题讨论】:

    标签: objective-c cocoa window floating


    【解决方案1】:

    您应该查看NSWindow 上的canBecomeKeyWindow 和canBecomeMainWindow 方法。听起来您希望您的窗口保持 key 状态,而不能成为 main 窗口。这里有一些资源可以帮助您:

    【讨论】:

    • 我创建了一个 NSPanel 的子类,硬编码返回 canBecomeKeyWindow 和 canBecomeMainWindow。最好的结果是两者都返回 NO – 面板上的按钮可以被点击,而 window 永远不会被激活。唯一的问题是 application 在点击时确实会被激活(其名称出现在左上角)。在 Info.plist 中使用 UIElement = YES 覆盖它后,应用程序本身不会被激活,但在单击面板之前处于活动状态的窗口会被停用。有没有办法避免这种情况发生?
    • 看起来你应该可以设置[panel setHidesOnDeactivate:NO] 来解决这个问题。文档here.
    • 我已经用[panel setFloatingPanel: YES]; 覆盖了面板的隐藏,因此面板浮动在所有应用程序之上,但即使在添加(或替换 setFloatingPanel 为)setHidesOnDeactivate:NO 之后,问题仍然存在仍然存在:当我在另一个应用程序处于活动状态时单击我的面板时,该应用程序将停用并且我的应用程序将被激活。单击我的应用程序面板时是否可以避免停用其他应用程序?
    • 此外,NSControl 的setRefusesFirstResponder 可以在单击时对控件移动到前面产生影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多