【发布时间】:2019-10-29 00:50:35
【问题描述】:
检测用户是否启用此 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;
}
}
【问题讨论】:
-
用户如何禁用录屏API?
-
可能还不清楚。 Catalina 中有新的隐私开关。 API 的使用将触发一个隐私窗口,其中用户有 2 个选项:1)拒绝,2)打开系统设置并手动启用。没有允许按钮。
-
谢谢,抱歉,我无法帮助您解决问题,但很高兴知道 :)
-
@MarekH 我们可以绕过/禁止这个隐私窗口吗?
-
macOS 11 中的 API 是否有任何更新?
标签: macos cocoa screen-recording macos-catalina