抓住一个模糊窗口的屏幕截图

时间:2012-08-16 17:21:08

标签: objective-c macos quartz-graphics

我正在使用CGWindowListCreateImage来获取屏幕截图。我正试图抓住一个特定的窗口,我知道它的windowID。这是我正在使用的代码,但似乎总是抓住整个屏幕,包括所有窗口。

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionOnScreenOnly, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);

我做错了什么?

2 个答案:

答案 0 :(得分:4)

你要求它抓住整个屏幕,包括所有窗口,这样你才能得到你所要求的。看看the documentation

  

windowOption

     
    

描述要包含哪些窗口的选项     图片。典型选项可让您选择上面的所有窗户或窗户     在windowID参数中指定的窗口下方。更多     信息,请参阅“窗口列表选项常量”。

  

对于此值,您正在传递kCGWindowListOptionOnScreenOnly,这意味着:

  

列出当前屏幕上的所有窗口。 Windows从前到后依次返回。使用此选项检索列表时,relativeToWindow参数应设置为kCGNullWindowID。

从技术上讲,使用windowID传递此选项甚至是不合法的,但是如果你这样做,Quartz很好,只是忽略你的ID。

如果您希望将屏幕截图限制在窗口的屏幕矩形中,则需要传递,而不是CGRectNull。如果您想要隐藏窗口而不是前面的窗口,请使用kCGWindowListOptionOnScreenBelowWindow | kCGWindowListOptionIncludingWindow作为选项。

答案 1 :(得分:1)

我遇到了同样的问题。记录kCGWindowImageBoundsIgnoreFraming选项以允许指定CGRectNull

  

当请求的捕获矩形为CGRectNull时,使用此选项仅捕获窗口区域,并不捕获任何窗口框架效果占用的区域。

但对我来说,我必须指定kCGWindowListOptionIncludingWindow作为唯一的窗口选项。这与文档中的内容相矛盾:

  

您必须将此选项与kCGWindowListOptionOnScreenAboveWindowkCGWindowListOptionOnScreenBelowWindow选项结合使用,以检索有意义的结果。

但如果我遵循这个建议,截图始终是整个屏幕。总而言之,以下对我的预期效果如下:

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionIncludingWindow, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);

(或者几乎与预期一样 - 屏幕截图仍然包含窗口的标题栏,我希望kCGWindowImageBoundsIgnoreFraming可以认为窗口的标题栏也被跳过了。