Sonofgrab демонстрирует API Cgwindow, чтобы захватить содержимое произвольных наборов Windows.
Сердечком этого образца является 5 методов в классе контроллера, описанные ниже.
-UpdateWindowlist Этот метод получает текущий список Windows от Window Server. Параметры в графическом интерфейсе позволяют исключить за кадром Windows и элементы рабочего стола. Список, возвращаемый с оконного сервера, обрабатывается (через обратный вызов WindowlistApplierFunction) для создания списка, представленного в графическом интерфейсе.
-CreatesingLywindowshot создает снимок экрана относительно одного Cgwindowid, который передается.
-createMultiWindowShot создает снимок экрана с именно этими Windows. Использует метод -CreateWindowlistFromSelection для создания совместимого CfarrayRef, который определяет окна для создания изображения.
-createScreenshot создает снимок экрана из всех окон, которые в настоящее время на экране и читаемой.
-createWindowListFromSelection Преобразует выбор GUI Windows в CfarrayRef, который определяет точный список Windows для рендеринга и приказ о их рендеринге.
API CGWINDOW способен решать общие проблемы, с которыми вы можете столкнуться на практике, как правило, возвращая NULL, если невозможно связаться с сервером окон или полным прозрачным изображением, когда невозможно составить изображение из приведенного списка. Комментарии в cgwindow.h рассказывают о угловых делах и других проблемах, которые вы можете найти при использовании этого API и неоценимы в понимании того, что произойдет во многих общих случаях использования.
API CGWINDOW предоставляет CGIMAGEREF, что данные чьи поддержки создаются по требованию с помощью Window Server при первом отображении, и как таковые вы можете запросить большое количество изображений, не получая производительность до тех пор, пока изображение не будет отображено. Если вы снимаете большое количество изображений, вы увидите время, необходимое для создания тех изображений, проведенных в процессе Windowserver, и вы должны знать, что, хотя CgwindowlistCreateImage будет быстро возвращается. Нарисование изображения впервые, вероятно, будет потреблять больше времени, чем вы могли бы ожидать от изображения из других источников.
Пример кода может быть настроен на время его операций, установив Profile_Window_grab на 1. Определение этого макроса не выполнено на 0 в исходном файле Controller.m.
Для получения дополнительной информации об API CGWINDOW см. Справочник «Кварц Окно» (https://developer.apple.com/library/mac/documentation/carbon/reference/cgwindow_reference/).
OS X 10.10 SDK или позже
OS X 10,8 или позже
Версия 2.0
Версия 1.0
=========================================================================================================