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。我可以确认获取窗口名是在有权限的情况下工作的,没有权限则失败。