swift 如何在不窃取macOS焦点的情况下显示窗口?

snz8szmq  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(142)

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

我可以用window?.level = Int(CGWindowLevelForKey(.maximumWindow))很容易地使一个窗口浮在所有其他窗口上,但我不能让两个窗口都有焦点,帮助!
可可中是否有类似ShowWithoutActivating的函数?

mwkjh3gx

mwkjh3gx1#

我一直在尝试这个方法,当最前面的窗口与最前面的应用程序不是来自同一个进程时,我似乎能够产生这种效果,我怀疑Spotlight可能就是这样做的。我可以这样实现:
1.在我的应用的Info.plist中将LSUIElement设置为YES。
1.在界面生成器中,将窗口的类设置为NSPanel,在属性检查器中选中“非激活”,并在身份检查器下的用户定义的运行时属性中将“isFloatingPanel”设置为YES。
1.在一些其他应用程序在前面的时间(我只是使用了5秒的延迟,让自己有时间弹出一些其他应用程序到前面并选择一个文本字段),调用makeKeyAndOrderFront(),然后在窗口上调用orderFrontRegardless()
当我这样做时,我得到以下内容(注意焦点环仍然绘制在Xcode的“Module”字段上):

juud5qan

juud5qan2#

有两个关键条件:
1.使用NSPanel作为窗口
1.将.nonactivatingPanel添加到NSPanelstyleMask

let window = NSPanel(
    contentRect: NSRect(x: 0, y: 0, width: 375, height: 800),
    styleMask: [
        .nonactivatingPanel,
        .titled,
        .closable,
        .miniaturizable,
        .resizable,
        .fullSizeContentView
    ],
    backing: .buffered,
    defer: false
)

相关问题