【问题标题】:How to show a window without stealing focus on macOS?如何在不将焦点转移到 macOS 的情况下显示窗口?
【发布时间】:2017-09-03 13:14:28
【问题描述】:

我想知道聚光灯怎么会随着焦点浮动,而另一个窗口仍然有焦点!

我可以很容易地用window?.level = Int(CGWindowLevelForKey(.maximumWindow)) 让一个窗口漂浮在所有其他窗口上,但是我不能让两个窗口都具有焦点,帮助!

Cocoa 中有没有类似ShowWithoutActivating 的函数?

【问题讨论】:

  • 你是什么意思“两者都有焦点”?那是不可能的。如果是这样,那么您的打字将同时进入两个窗口,这将非常混乱和麻烦。 Spotlight 窗口绝对“窃取”焦点。 (我不会真的认为它是“窃取”,因为它是用户要求的。)

标签: swift macos cocoa nswindow


【解决方案1】:

我一直在玩这个,当最前面的窗口与最前面的应用程序不是来自同一个进程时,我似乎能够产生这种效果,这就是我怀疑 Spotlight 可能正在做的事情。我可以这样实现:

  1. 在我应用的 Info.plist 中将 LSUIElement 设置为 YES。

  2. 在 Interface Builder 中,将窗口的类设置为 NSPanel,在 Attributes Inspector 中勾选“Non Activating”,在 Identity Inspector 下的 User Defined Runtime Attributes 中将“isFloatingPanel”设置为 YES。

  3. 在某个其他应用程序在前面的一段时间内(我只是使用了 5 秒的延迟让自己有时间将其他应用程序弹出到前面并选择一个文本字段),调用 makeKeyAndOrderFront() 然后orderFrontRegardless() 在窗口上。

当我这样做时,我得到以下信息(注意焦点环仍然绘制在 Xcode 的“模块”字段上):

【讨论】:

  • 非常感谢!这就是我想要的。而且你的回答很清楚,真心感谢你的帮助。
  • 将焦点返回到我需要的上一个应用程序以获取哪个应用程序处于活动状态 (NSWorkspace.shared.runningApplications.first(where: {$0.isActive})),停止文本字段成为第一响应者 (win.makeFirstResponder(nil)),然后调用 activeApp?.activate(options: NSApplication.ActivationOptions.activateAllWindows) 到让应用重新获得焦点。
  • 如何使用“停用时隐藏”选项使其工作。藏了之后,我就拿不回来了。没有这个选项也可以工作。只有activate(ignoringOtherApps: true),但它会抢走焦点:(
  • 我找到了解决方案。我不得不禁用此选项并编写一些解决方法:stackoverflow.com/questions/15077471/…
  • 回应@DanielCompton - 我刚刚使用了window.resignKey()。这将焦点放在先前聚焦的视图上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2014-08-16
相关资源
最近更新 更多