SonofGrab演示了CGWindow API,以獲取任意窗口的內容。
該樣本的核心是控制器類別上的5種方法,如下所述。
-updateWindowList此方法從Window服務器獲取窗口的當前列表。 GUI中的選項可讓您排除屏幕外窗口和桌面元素。從Window服務器返回的列表將進一步處理(通過WindowListAppLierFunction回調),以生成GUI中顯示的列表。
- CreateSingleWindowShot相對於傳遞的單個CGWINDOWID創建了屏幕截圖。根據GUI中指定的“單窗口選項”,屏幕截圖可能包括其他數量的其他窗口,並且可能包括或可能不包括實際傳遞給此方法的窗口。
-createmultiwindowshot創建了一個屏幕截圖,並完全傳遞了這些窗口。使用-CreateWindowListFromSelection方法創建兼容的CfarrayRef,該cfarrayref指定了窗口來創建圖像的窗口。
-CreatesCreenshot從當前在屏幕上且可讀的所有窗口創建屏幕截圖。
-CreateWIndowListFromSelection將Windows的GUI選擇轉換為Cfarrayref,該窗口指定了渲染的確切窗口列表,並將其渲染為渲染。
CGWINDOW API能夠處理您在實踐中可能遇到的常見問題,如果無法與窗口服務器聯繫,通常會返回NULL,或者如果無法從列表中撰寫圖像時,則可以返回null。 cgwindow.h中的評論在使用此API時可能會發現的其他問題詳細介紹,並且在理解許多常見用例中會發生什麼是無價的。
CGWINDOW API提供了CGIMAGEREF,其備用數據是在首次渲染時按照窗口服務器的需求創建的,因此您可以請求大量圖像,而無需進行性能,直到呈現圖像。如果您要捕獲大量圖像,您將看到創建在Windowser流程中花費的圖像所需的時間,並且您應該知道,儘管CGWindowListCreateImage將很快返回。首次繪製圖像的時間可能比您預期的時間比其他來源的圖像所預期的要多。
可以通過將profile_window_grab設置為1來配置示例代碼以適時其操作。該宏的定義在controller.m源文件中默認為0。
有關CGWINDOW API的更多信息,請參閱“石英窗口服務”參考(https://developer.apple.com/library/mac/documentation/carbon/carbon/reference/cgwindow_reference/)。
OS X 10.10 SDK或更高版本
OS X 10.8或更高版本
2.0版
1.0版
==========================================================================================================================