【问题标题】:Swift - how to make window unactivable?Swift - 如何使窗口无法激活?
【发布时间】:2019-12-02 14:04:20
【问题描述】:

我想让应用程序无法激活。

我的意思是,即使单击它,它也必须处于非活动状态且非前景。活动窗口必须与点击我的应用之前的应用相同。

我该怎么做?


更新:

  1. 让我们想象一些窗口/面板。就像一个码头。我们称它为“Docky”
  2. Docky 处于非活动状态,活动窗口是 Safari:

    NSRunningApplicationSafari.isActive == true
    NSRunningApplicationDocky.isActive == false
    
  3. 我正在点击 Docky 的任何空白点。

预期结果:

  1. Safari 仍然是活动窗口。喜欢点击之前:

    NSRunningApplicationSafari.isActive == true
    NSRunningApplicationDocky.isActive == false
    

实际结果:

  1. Docky 是活动窗口,Safari 是非活动窗口:

    NSRunningApplicationSafari.isActive == false
    NSRunningApplicationDocky.isActive == true
    

另一个示例是键盘查看器。您正在单击虚拟键盘,但活动窗口是另一个应用程序。 Ant 获取 keyPress 事件的完全活动窗口。

【问题讨论】:

  • 也许您想更详细地解释您的应用的目标,因为您似乎并不清楚您要实现的目标。
  • @SimonBachmann 的行为与 Dock 相同。它总是不活动的。即使您点击它也不能是“最顶级”或“活跃”的应用程序。

标签: swift swiftui macos-catalina


【解决方案1】:

其实你只需要.nonactivatingPanel 风格的面板。其他一切都是细节,例如此窗口的级别、覆盖 acceptsFirstMouse:needsPanelToBecomeKey 的自定义视图等。顺便说一句,按钮默认接受第一次点击,在这种情况下不激活应用程序。

因此,例如,您的 AppDelegate 可能如下所示:

class AppDelegate: NSObject, NSApplicationDelegate {

    var docky: NSPanel!

    func applicationDidFinishLaunching(_ aNotification: Notification) {

        // Create the window and set the content view. 
        docky = NSPanel(
            contentRect: NSRect(x: 0, y: 0, width: 120, height: 600),
            styleMask: [.nonactivatingPanel],
            backing: .buffered, defer: false)
        docky.level = .mainMenu
        ....
        docky.orderFrontRegardless()
    }

【讨论】:

  • 你是最棒的,阿斯佩里!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-07-28
  • 2012-05-24
相关资源
最近更新 更多