CGWindowListCopyWindowInfo返回kCGWindowSharingState设置为0的信息。

问题描述 投票:0回答:1

我正试图获得 kCGWindowSharingState 窗口的值。

我创建了一个新项目,并将 NSWindow.sharingTypeNSWindowSharingReadWrite.

我创建了另一个项目,并在该项目中运行以下代码来获取 kCGWindowSharingState:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSLog(@"windowList: %@", windowList);

它返回一个包含有 kCGWindowSharingState 值,但它总是被设置为 0.

任何有关这方面的帮助将是很好的。先谢谢你了,我正在尝试使用[NSWindow setSharingType:NSWindowSharingReadWrite];但这并不奏效。

objective-c cocoa nswindow
1个回答
1
投票

您的 另一个项目 必须有屏幕录制的权限。有沒有API來要求這些權限?没有。你必须尝试录制一个屏幕来获取系统对话框。

- (BOOL)doWeHaveScreenRecordingPermissions {
    // Try to record -> triggers system dialog
    CGDisplayStreamRef stream = CGDisplayStreamCreate(CGMainDisplayID(), 1, 1, kCVPixelFormatType_32BGRA, nil, ^(CGDisplayStreamFrameStatus status, uint64_t displayTime, IOSurfaceRef frameSurface, CGDisplayStreamUpdateRef updateRef) {
    });

    // NULL = No permissions
    BOOL result = stream != NULL;

    if (stream) {
        CFRelease(stream);
    }

    return result;
}

你可以使用 CGWindowListCopyWindowInfo 没有这些权限,但对 kCGWindowSharingState 永远 0. 一旦你的另一个应用程序获得这些权限,正确的值将被返回。

简单的讨论在 WWDC 2019--macOS安全方面的进展。.

这种安全舞适用于 kCGWindowSharingState & kCGWindowName.


我的应用委托人。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSLog(@"Screen Recording permissions: %@", [self doWeHaveScreenRecordingPermissions] ? @"Yay!" : @"N/A");

    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
    if (windowList == NULL) {
        return;
    }

    CFIndex count = CFArrayGetCount(windowList);
    for (CFIndex index = 0 ; index < count ; index++) {
        CFDictionaryRef windowInfo = CFArrayGetValueAtIndex(windowList, index);

        CFStringRef owner = CFDictionaryGetValue(windowInfo, kCGWindowOwnerName);
        if (owner == NULL) {
            continue;
        }

        if (CFStringCompare(owner, CFSTR("ShareWindow"), 0) != kCFCompareEqualTo) {
            continue;
        }

        NSLog(@"Got a window from ShareWindow! %@", windowInfo);
    }

    CFRelease(windowList);
}

没有屏幕录制权限

2020-06-03 13:22:36.073581+0200 GetSharedWindow[54889:828225] Screen Recording permissions: N/A
2020-06-03 13:22:36.074951+0200 GetSharedWindow[54889:828225] Got a window from ShareWindow! {
    kCGWindowAlpha = 1;
    kCGWindowBounds =     {
        Height = 292;
        Width = 480;
        X = 235;
        Y = 538;
    };
    kCGWindowIsOnscreen = 1;
    kCGWindowLayer = 0;
    kCGWindowMemoryUsage = 1152;
    kCGWindowNumber = 5672;
    kCGWindowOwnerName = ShareWindow;
    kCGWindowOwnerPID = 54445;
    kCGWindowSharingState = 0;         <-----
    kCGWindowStoreType = 1;
}

屏幕录制权限

2020-06-03 13:24:33.823247+0200 GetSharedWindow[55697:832599] Screen Recording permissions: Yay!
2020-06-03 13:24:33.824580+0200 GetSharedWindow[55697:832599] Got a window from ShareWindow! {
    kCGWindowAlpha = 1;
    kCGWindowBounds =     {
        Height = 292;
        Width = 480;
        X = 235;
        Y = 538;
    };
    kCGWindowIsOnscreen = 1;
    kCGWindowLayer = 0;
    kCGWindowMemoryUsage = 1152;
    kCGWindowName = Window;
    kCGWindowNumber = 5672;
    kCGWindowOwnerName = ShareWindow;
    kCGWindowOwnerPID = 54445;
    kCGWindowSharingState = 2;         <-----
    kCGWindowStoreType = 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.