我正在使用CGWindowListCreateImage来获取屏幕截图。我正试图抓住一个特定的窗口,我知道它的windowID。这是我正在使用的代码,但似乎总是抓住整个屏幕,包括所有窗口。
CGImageRef windowImage = CGWindowListCreateImage(
CGRectNull,
kCGWindowListOptionOnScreenOnly,
windowID,
kCGWindowImageBoundsIgnoreFraming);
我做错了什么?
答案 0 :(得分:4)
你要求它抓住整个屏幕,包括所有窗口,这样你才能得到你所要求的。看看the documentation:
windowOption
描述要包含哪些窗口的选项 图片。典型选项可让您选择上面的所有窗户或窗户 在windowID参数中指定的窗口下方。更多 信息,请参阅“窗口列表选项常量”。
对于此值,您正在传递kCGWindowListOptionOnScreenOnly
,这意味着:
列出当前屏幕上的所有窗口。 Windows从前到后依次返回。使用此选项检索列表时,relativeToWindow参数应设置为kCGNullWindowID。
从技术上讲,使用windowID传递此选项甚至是不合法的,但是如果你这样做,Quartz很好,只是忽略你的ID。
如果您希望将屏幕截图限制在窗口的屏幕矩形中,则需要传递,而不是CGRectNull
。如果您想要隐藏窗口而不是前面的窗口,请使用kCGWindowListOptionOnScreenBelowWindow | kCGWindowListOptionIncludingWindow
作为选项。
答案 1 :(得分:1)
我遇到了同样的问题。记录kCGWindowImageBoundsIgnoreFraming
选项以允许指定CGRectNull
:
当请求的捕获矩形为
CGRectNull
时,使用此选项仅捕获窗口区域,并不捕获任何窗口框架效果占用的区域。
但对我来说,我必须指定kCGWindowListOptionIncludingWindow
作为唯一的窗口选项。这与文档中的内容相矛盾:
您必须将此选项与
kCGWindowListOptionOnScreenAboveWindow
或kCGWindowListOptionOnScreenBelowWindow
选项结合使用,以检索有意义的结果。
但如果我遵循这个建议,截图始终是整个屏幕。总而言之,以下对我的预期效果如下:
CGImageRef windowImage = CGWindowListCreateImage(
CGRectNull,
kCGWindowListOptionIncludingWindow,
windowID,
kCGWindowImageBoundsIgnoreFraming);
(或者几乎与预期一样 - 屏幕截图仍然包含窗口的标题栏,我希望kCGWindowImageBoundsIgnoreFraming
可以认为窗口的标题栏也被跳过了。