Objective c 抓取一个模糊窗口的屏幕截图

Objective c 抓取一个模糊窗口的屏幕截图,objective-c,macos,quartz-graphics,Objective C,Macos,Quartz Graphics,我正在使用CGWindowListCreateImage获取屏幕截图。我试图抓取一个特定的窗口,我知道它的windowID。这是我正在使用的代码,但它似乎总是占据整个屏幕,包括所有窗口 CGImageRef windowImage = CGWindowListCreateImage( CGRectNull, kCGWindowListOptionOnScreenOnly, windowID, kCGWindowImageBoundsIgnor

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

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

我做错了什么?

你要求它抓取整个屏幕,包括所有窗口,所以你得到的正是你想要的。看看:

窗口选项

描述要在中包括哪些窗口的选项 形象。典型选项允许您选择所有窗口或上方或上方的窗口 在windowID参数中指定的窗口下方。更多 有关详细信息,请参阅“窗口列表选项常量”

对于此值,您要传递的是
KCGWindowListoptionnScreenOnly
,这意味着:

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

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


如果您希望将屏幕截图绑定到窗口的屏幕矩形,则需要传递它,而不是
CGRectNull
。如果你想要模糊的窗口而不是前面的窗口,请使用
kcgwindowlistoptionnscreenbelowwindow | kCGWindowListOptionIncludingWindow
作为选项。

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

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

但对我来说,我必须指定
kcgwindowlistoption includingwindow
作为唯一的窗口选项。这与文档中所说的有点矛盾:

您必须将此选项与
kcgwindowlistoptionnscreen上方窗口
kcgwindowlistoptionnscreen下方窗口
组合,才能检索有意义的结果

但是如果我遵循这个建议,屏幕截图永远是整个屏幕。总而言之,以下几点对我起到了预期的作用:

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionIncludingWindow, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);
(或者几乎和预期的一样-截图仍然包含窗口的标题栏,我希望
kCGWindowImageBoundsIgnoreFraming
也会跳过窗口的标题栏)