2015-04-18 47 views
3

我想爲遊戲玩家構建一個幫手應用程序,並構建一些額外的功能,我希望觀察/計算某些第三方遊戲行爲,更具體地說,遊戲實際啓動全屏過程時。如何檢測/觀察第三方應用何時啓動全屏過程?

例如:我的應用程序是一個系統托盤應用程序,遊戲中有一個帶有大廳和菜單屏幕的「啓動器」應用程序。一旦遊戲啓動額外的過程,通常OS X將切換分辨率(可選),我的應用程序將以某種方式通知。然後我可以啓動一個計時器。一旦比賽結束,無論進程是關閉還是遊戲不再是全屏,我的應用程序會得到第二個通知,我可以停止計時器。

是否有官方Apple API提供任何方式來觀察/輪詢應用程序全屏顯示和/或啓動額外的窗口,我可以認爲它是實際的遊戲屏幕?

回答

0

如果沒有通知,則無法觀察通知。因此,首先您需要知道您要觀察的應用程序是否實際發送了可觀察的通知。沒有他們的計劃同意,你不能'勾住'其他應用程序。

1

我懷疑你會找到一個完全全面的解決方案。應用程序可以通過多種方式實現全屏體驗,而且大多數方法不會提供有關該事實的通知。

全屏應用程序可以修改presentationOptionsNSApplication以隱藏Dock和菜單欄。另一個應用程序可以使用鍵值觀察來監視其應用程序對象的currentSystemPresentationOptions屬性,該屬性將反映當前的系統狀態。

全屏應用程序可以捕獲顯示器(儘管Apple不鼓勵這種技術)。您可以嘗試通過調用CGDisplayIsCaptured()來檢測此問題,儘管從10.9開始已棄用而沒有替換。如果您使用CGDisplayRegisterReconfigurationCallback()註冊回調,則有可能會在捕獲顯示時收到警報。但是,捕獲顯示是阻止其他進程注意到這種變化,所以可能不會。在這種情況下,你必須進行民意調查。您也可以輪詢當前的顯示模式;改變模式是遊戲首先捕捉顯示的主要原因。

全屏遊戲也可以創建一個無邊框窗口,並將其窗口大小設置爲Dock和菜單欄(以及其他應用程序的窗口)的前面。這並沒有真正的通知。您可以使用CGWindowList API檢測到它,但您必須進行輪詢。例如,您可以撥打CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID)並遍歷查找屏幕大小的字典並在窗口級別高於kCGStatusWindowLevel

(您可能能夠使用輔助功能API得到通知時,最前面的窗口變化,所以你只有當這種情況發生輪詢。)

相關問題