【问题标题】:Mac - How to programmatically hide NSApplicationActivationPolicyAccessory or LSUIElement application?Mac - 如何以编程方式隐藏 NSApplicationActivationPolicyAccessory 或 LSUIElement 应用程序?
【发布时间】:2015-06-18 18:42:01
【问题描述】:

我正在编写一个基于 Swift 的小型 Cocoa 应用程序。这是一个单窗口应用程序,类似于 Spotlight/QuickSilver/Alfred。它被设置为NSApplicationActivationPolicyAccessory (docs) (虽然我用LSUIElement 尝试过同样的事情,这是等价的)。它是通过全局热键激活的。

一切正常,除了当它处于活动状态时,我无法使用NSRunningApplication.currentApplication().hide() 隐藏应用程序。

The docs 对于 hide 方法说“如果应用程序已经退出,或者 如果是无法隐藏的类型,则该值的属性将是 NO。” (强调我的),我得到了一个NO 回来(虽然我实际上使用的是 Swift,所以我得到了false)。

我可以理解为什么 NSApplicationActivationPolicyProhibited 应用程序无法被隐藏,因为它从未处于活动状态,但让我感到困惑的是 NSApplicationActivationPolicyAccessory 也会出现这种情况。

我尝试了myWindow.orderOut(self);,但这只是隐藏了窗口,而没有隐藏我的应用程序并将焦点返回到前一个应用程序。

我确实存储了对先前活动应用程序的引用,因此如果需要,我可以再次手动激活该应用程序,但我希望有一种更简洁的方法来执行此操作。

【问题讨论】:

  • 你试过NSApplication.sharedApplication().hide(nil)吗?通常会针对应用程序对象(NSApplication 的实例)而不是NSRunningApplication 的实例来处理当前应用程序。
  • @KenThomases 做到了!谢谢!你能把这个写成答案,以便我把它标记为正确的吗?

标签: macos cocoa


【解决方案1】:

使用NSApplication.sharedApplication().hide(nil)。通常会针对应用程序对象(NSApplication 的实例)而不是NSRunningApplication 的实例来处理当前应用程序。

【讨论】:

  • Swift 4:NSApplication.shared.hide(nil)
【解决方案2】:

手动解决方案是存储对先前活动的NSRunningApplication 实例(下面称为previouslyActiveApplication)的引用,然后在您想停用NSApplicationActivationPolicyAccessory 应用程序时将其激活,如下所示:

previouslyActiveApplication!.activateWithOptions(NSApplicationActivationOptions.ActivateIgnoringOtherApps);

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2018-11-17
    • 2018-08-12
    • 2011-10-22
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多