2017-09-23 30 views
1

すべての入力イベントをキャプチャする画面全体(ドックとメニューバーも含む)にウィンドウオーバーレイを表示しようとしています。 。私はこれが可能であることを知っている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開発者にはかなり新しいので、いくつかの提案をいただければ幸いです。

答えて

1

2番目のアプローチでは、ウィンドウレベルをCGShieldingWindowLevel()に設定して解決しました。 これが正しいか(アップルの許可)、使用できるかどうかは確かです(ドキュメントには...)。

関連する問題