3

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

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

我究竟做错了什么?

4

2 回答 2

4

您要求它抓取整个屏幕,包括所有窗口,因此您得到的正是您所要求的。查看文档

窗口选项

描述要包含在图像中的窗口的选项。典型选项使您可以选择所有窗口或在 windowID 参数中指定的窗口上方或下方的窗口。有关详细信息,请参阅“窗口列表选项常量”。</p>

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

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

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

如果您希望您的屏幕截图绑定到窗口的屏幕矩形,您需要传递它,而不是CGRectNull. 如果您想要隐藏的窗口而不是它前面的东西,请使用kCGWindowListOptionOnScreenBelowWindow | kCGWindowListOptionIncludingWindow您的选项。

于 2012-08-16T18:19:29.707 回答
1

我只是有同样的问题。该kCGWindowImageBoundsIgnoreFraming选项记录在案以允许指定CGRectNull

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

但对我来说,我不得不指定kCGWindowListOptionIncludingWindow为唯一的窗口选项。这与文档所说的有点矛盾:

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

但如果我听从了这个建议,屏幕截图总是整个屏幕。总而言之,以下内容按预期对我有用:

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

(或者几乎与预期的一样 - 屏幕截图仍然包含窗口的标题栏,我希望这kCGWindowImageBoundsIgnoreFraming意味着窗口的标题栏也被跳过)。

于 2017-06-16T14:09:28.147 回答