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版
==========================================================================================================================