Определение настроек записи экрана в macOS Catalina - PullRequest
3 голосов
/ 14 июня 2019

Какой надежный способ определить, активировал ли пользователь этот API?

CGWindowListCreateImage возвращает действительный объект, даже если API записи экрана отключен.Возможны несколько комбинаций (kCGWindowListOptionIncludingWindow, kCGWindowListOptionOnScreenBelowWindow), и только некоторые из них вернут NULL.

- (CGImageRef)createScreenshotImage
{
    NSWindow *window = [[self view] window];
    NSRect rect = [window frame];

    rect.origin.y = NSHeight([[window screen] frame]) - NSMaxY([window frame]);
    CGImageRef screenshot = CGWindowListCreateImage(
                                                    rect,
                                                    kCGWindowListOptionIncludingWindow,
                                                    //kCGWindowListOptionOnScreenBelowWindow,
                                                    0,//(CGWindowID)[window windowNumber],
                                                    kCGWindowImageBoundsIgnoreFraming);//kCGWindowImageDefault
    return screenshot;
}

Единственный надежный способ - через CGDisplayStreamCreate, что рискованно, поскольку Apple всегда меняет настройки конфиденциальности каждый год.

   - (BOOL)canRecordScreen
    {
        if (@available(macOS 10.15, *)) {
            CGDisplayStreamRef stream = CGDisplayStreamCreate(CGMainDisplayID(), 1, 1, kCVPixelFormatType_32BGRA, nil, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef) {
                ;
            });
            BOOL canRecord = stream != NULL;
            if (stream) { 
              CFRelease(stream); 
            }
            return canRecord;
        } else {
            return YES;
        }
    }
...