Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Catalina中启用屏幕录制API(kCGWindowName)_Macos_Cocoa_Macos Catalina_Screen Recording - Fatal编程技术网

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

Macos 在Catalina中启用屏幕录制API(kCGWindowName),macos,cocoa,macos-catalina,screen-recording,Macos,Cocoa,Macos Catalina,Screen Recording,以下代码在莫哈韦运行良好 let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly, CGWindowListOption.optionOnScreenAboveWindow) let windowList = CGWindowListCopyWindowInfo(options, kCGNullWi

以下代码在莫哈韦运行良好

let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly, CGWindowListOption.optionOnScreenAboveWindow)
let windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID) as NSArray? as? [[String: AnyObject]]

for entry  in windowList!
{ let name = (entry[kCGWindowName as String] != nil) ? entry[kCGWindowName as String] as! String : ""
  ...
在卡塔利纳

entry[kCGWindowName as String] 
总是零

在SO中:我读到,如果启用了“屏幕录制API”和“如何检测”,则不需要这样做

不幸的是,我没有找到如何启用“屏幕录制API”

如SO中所述:我打开了自动代码签名

在系统首选项中,我没有看到添加应用程序的“+”命令,也没有看到授予“屏幕录制”权限的“+”命令


如何授予屏幕录制的API权限?

您需要调用任何屏幕录制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);

}

从这里可以得到解决方案:

这是一个请求访问屏幕录制的低级api。调用此函数将显示提示,允许访问屏幕录制

/*如果不存在,则请求事件侦听访问,可能会提示*/
@可用(macOS 10.15,*)
public func CGRequestScreenCaptureAccess()->Bool

我的情况不同,因为我通过nodejs使用javascript,但我觉得这是相关的。对于空窗口名,我遇到了相同的问题。您可以在这里查看代码:,它最终使我能够在catalina中请求屏幕录制权限。我的应用现在有屏幕录制权限,但仍然无法获取窗口名称。我收回它!我有一个无关的bug。我可以确认获取窗口名是在有权限的情况下工作的,没有权限则失败。