すべての入力イベントをキャプチャする画面全体(ドックとメニューバーも含む)にウィンドウオーバーレイを表示しようとしています。 。私はこれが可能であることを知っているAppStoreのアプリはそれをやっているので。オーバーレイウィンドウを表示して全画面表示する方法
私が見つけた二つのアプローチ: まず:第二
let windowLevel = CGShieldingWindowLevel();
let windowRect = NSScreen.main?.frame
var overlayWindow = NSWindow(contentRect: windowRect!, styleMask: NSWindow.StyleMask.borderless, backing: NSWindow.BackingStoreType.buffered, defer: false, screen: NSScreen.screens[0])
overlayWindow.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(windowLevel))
overlayWindow.backgroundColor = .black
overlayWindow.alphaValue = 0.4
overlayWindow.makeKeyAndOrderFront(nil)
overlayWindow.makeMain()
: 使用してストーリーボード
let window = FullScreenWindowController(windowNibName: NSNib.Name(rawValue: "FullScreenWindow"))
self.application.runModal(for: self.window.window!)
最初のソリューションが表示されるように、このログが発生します。
Assertion failure in -[NSWindow _changeJustMain], /Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1504.83.101/AppKit.subproj/NSWindow.m:14861
Invalid parameter not satisfying: [self canBecomeMainWindow]
そして、モーダルがある間はタイマーを動かすこともできません提示される。モーダルはすべてのイベントをブロックし、タイマーループは発生しません。 NSRunnerルーパーでいくつかのアプローチを見ましたが、現在のSDKバージョンではまだこれが可能かどうかはわかりません。
第2の解決策としては、最初のアプリの状態を復元できません。表示した後にオーバーレイを非表示にすることを意味します。 このソリューションのもう1つの欠点は、ドックがまだ見え、相互作用が可能であることです。
私はMacOS開発者にはかなり新しいので、いくつかの提案をいただければ幸いです。