在 Catalina 中启用屏幕录制 API (kCGWindowName)

mic*_*ica 6 macos cocoa screen-recording macos-catalina

以下代码在 Mojave 中运行良好。

\n\n
let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly, CGWindowListOption.optionOnScreenAboveWindow)\nlet windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) as NSArray? as? [[String: AnyObject]]\n\nfor entry  in windowList!\n{ let name = (entry[kCGWindowName as String] != nil) ? entry[kCGWindowName as String] as! String : ""\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

位于卡塔利娜岛

\n\n
entry[kCGWindowName as String] \n
Run Code Online (Sandbox Code Playgroud)\n\n

总是为零

\n\n

在《SO:检测 macOS Catalina 上的屏幕录制设置》中,我读到,启用“屏幕录制 API”需要 xc2xb4t 以及如何检测它是否已启用。

\n\n

不幸的是我不知道如何启用“屏幕录制API”。

\n\n

正如 SO: macOS Catalina 屏幕录制权限中所述,我打开了自动代码签名。

\n\n

在系统偏好设置中,我没有看到用于添加应用程序、授予“屏幕录制”的“+”。

\n\n

如何授予录屏API权限?

\n

小智 5

这是一个低级 API,用于请求访问屏幕录制。调用此函数将提示您授予屏幕录制权限。

/* Requests event listening access if absent, potentially prompting */
@available(macOS 10.15, *)
public func CGRequestScreenCaptureAccess() -> Bool
Run Code Online (Sandbox Code Playgroud)


小智 2

您需要调用任何屏幕录制 API 函数。例如截图:

(void)showScreenRecordingPrompt {
  /*
   macos 10.14 and lower do not require screen recording permission 
   to get window titles 
  */
  if(@available(macos 10.15, *)) {
    /*
     To minimize the intrusion just make a 1px image of the upper left corner
     This way there is no real possibilty to access any private data
    */
    CGImageRef screenshot = CGWindowListCreateImage(
        CGRectMake(0, 0, 1, 1),
        kCGWindowListOptionOnScreenOnly,
        kCGNullWindowID,
        kCGWindowImageDefault);

    CFRelease(screenshot);

}
Run Code Online (Sandbox Code Playgroud)

解决方案是从这里获得的:https://blog.csdn.net/lovechris00/article/details/96979960