Получите скриншоты всех рабочих областей на MacOS с помощью zsh-скрипта или приложения на C++. Узнайте, как выбрать конкретную рабочую область для захвата изображений активных пространств для текущего пользователя.
Рабочие области на MacOS позволяют пользователям организовывать свою работу, разделяя экран на отдельные пространства. Иногда возникает необходимость получить скриншоты каждой рабочей области для последующего использования. В этой статье рассмотрим, как сделать это с помощью zsh-скрипта или приложения на C++.
Для начала создадим zsh-скрипт, который будет делать скриншоты всех рабочих областей и сохранять их в отдельные файлы. Ниже приведен пример кода:
#!/usr/bin/env zsh
spaces=("Desktop" "Documents" "Apps" "Coding")
for space in $spaces
do
screencapture -m ~/Desktop/$space.png
done
В этом скрипте мы создали массив "spaces", содержащий имена рабочих областей, скриншоты которых мы хотим получить. Затем мы проходим по каждой рабочей области в цикле и делаем скриншот с помощью команды "screencapture". Имя каждого скриншота формируется из имени рабочей области и сохраняется на рабочем столе пользователя.
Если вы предпочитаете использовать C++ для создания приложений, которые делают скриншоты рабочих областей, вам понадобится библиотека, которая позволяет работать с MacOS API для работы с рабочими областями. Пример кода на C++:
#include <CoreFoundation/CoreFoundation.h>
#include <ApplicationServices/ApplicationServices.h>
int main() {
CFArrayRef windowList = CGWindowListCopyWindowInfo(
kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements,
kCGNullWindowID
);
for (int i = 0; i < CFArrayGetCount(windowList); ++i) {
CFDictionaryRef windowInfo = CFArrayGetValueAtIndex(windowList, i);
CFStringRef windowName = CFDictionaryGetValue(windowInfo, kCGWindowName);
if (windowName) {
CFIndex windowNumber = CFDictionaryGetInt64(windowInfo, kCGWindowNumber);
CGImageRef windowImage = CGWindowListCreateImage(
CGRectNull,
kCGWindowListOptionIncludingWindow,
windowNumber,
kCGWindowImageDefault
);
CFURLRef desktopURL = CFURLCreateWithFileSystemPath(
NULL,
CFSTR("~/Desktop/"),
kCFURLPOSIXPathStyle,
true
);
CFURLRef screenshotURL = CFURLCreateCopyAppendingPathComponent(
NULL,
desktopURL,
windowName,
false
);
CFStringRef screenshotPath = CFURLCopyFileSystemPath(screenshotURL, kCFURLPOSIXPathStyle);
CFRelease(desktopURL);
CFRelease(screenshotURL);
CFStringRef screenshotPathWithExtension = CFStringCreateWithFormat(
NULL,
NULL,
CFSTR("%@.png"),
screenshotPath
);
CFRelease(screenshotPath);
CGImageDestinationRef screenshotDestination = CGImageDestinationCreateWithURL(
(CFURLRef)screenshotURL,
kUTTypePNG,
1,
NULL
);
CGImageDestinationAddImage(screenshotDestination, windowImage, NULL);
CGImageDestinationFinalize(screenshotDestination);
CFRelease(screenshotDestination);
CFRelease(windowImage);
CFRelease(screenshotPathWithExtension);
}
}
CFRelease(windowList);
return 0;
}
В этом примере мы используем функции из библиотек CoreFoundation и ApplicationServices для работы с MacOS API. Мы получаем список окон с помощью функции CGWindowListCopyWindowInfo и проходим по каждому окну в цикле. Затем мы получаем изображение окна с помощью функции CGWindowListCreateImage и сохраняем его на рабочем столе пользователя с помощью функций библиотеки CoreFoundation.
Выбор конкретной рабочей области для захвата скриншотов
Если вы хотите выбрать конкретную рабочую область для получения скриншотов, вы можете использовать дополнительные параметры в zsh-скрипте или добавить соответствующую логику в приложение на C++.
Например, вы можете создать пользовательский интерфейс, где пользователь сможет выбрать рабочую область из списка. Затем вы можете передать выбранный параметр в скрипт или приложение и получить скриншот только этой рабочей области.
Независимо от того, какой вариант выберете вы, получение скриншотов всех рабочих областей или только конкретной рабочей области, поможет вам более эффективно организовать свою работу на MacOS.
Примечание:
Если вы используете zsh-скрипт, убедитесь, что он имеет права на выполнение (chmod +x script.sh). Если вы используете компиляцию C++ кода, убедитесь, что у вас установлены необходимые зависимости и используйте компилятор C++ для создания исполняемого файла.