我懷疑你會找到一個完全全面的解決方案。應用程序可以通過多種方式實現全屏體驗,而且大多數方法不會提供有關該事實的通知。
全屏應用程序可以修改presentationOptions
的NSApplication
以隱藏Dock和菜單欄。另一個應用程序可以使用鍵值觀察來監視其應用程序對象的currentSystemPresentationOptions
屬性,該屬性將反映當前的系統狀態。
全屏應用程序可以捕獲顯示器(儘管Apple不鼓勵這種技術)。您可以嘗試通過調用CGDisplayIsCaptured()
來檢測此問題,儘管從10.9開始已棄用而沒有替換。如果您使用CGDisplayRegisterReconfigurationCallback()
註冊回調,則有可能會在捕獲顯示時收到警報。但是,捕獲顯示是約阻止其他進程注意到這種變化,所以可能不會。在這種情況下,你必須進行民意調查。您也可以輪詢當前的顯示模式;改變模式是遊戲首先捕捉顯示的主要原因。
全屏遊戲也可以創建一個無邊框窗口,並將其窗口大小設置爲Dock和菜單欄(以及其他應用程序的窗口)的前面。這並沒有真正的通知。您可以使用CGWindowList
API檢測到它,但您必須進行輪詢。例如,您可以撥打CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID)
並遍歷查找屏幕大小的字典並在窗口級別高於kCGStatusWindowLevel
。
(您可能能夠使用輔助功能API得到通知時,最前面的窗口變化,所以你只有當這種情況發生輪詢。)