Swift-如何使窗口无法激活?

时间:2019-12-02 14:04:20

标签: swift swiftui macos-catalina

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

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

我该怎么做?


更新:

  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
    

另一个示例是Keyboard Viewer。您正在单击虚拟键盘,但活动窗口是另一个应用程序。蚂蚁正好在活动窗口中获取keyPress事件。

1 个答案:

答案 0 :(得分: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()
    }