抓取被遮挡窗口的屏幕截图

Ste*_*eod 3 macos objective-c quartz-graphics

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

CGImageRef windowImage = CGWindowListCreateImage(
      CGRectNull, 
      kCGWindowListOptionOnScreenOnly, 
      windowID, 
      kCGWindowImageBoundsIgnoreFraming);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

aba*_*ert 5

您要求它抓取整个屏幕,包括所有窗口,这样您就可以得到您所要求的内容。查看文档

\n\n
\n

窗口选项

\n\n
\n

描述图像中包含哪些窗口的选项。\n 典型选项允许您选择所有窗口或 windowID 参数中指定的窗口上方或下方的窗口。有关详细信息,请参阅\xe2\x80\x9c窗口列表选项常量。\xe2\x80\x9d

\n
\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n

如果您希望屏幕截图限制在窗口的屏幕矩形内,则需要传递该值,而不是CGRectNull. 如果您想要被遮挡的窗口而不是它前面的窗口,请使用kCGWindowListOptionOnScreenBelowWindow | kCGWindowListOptionIncludingWindow您的选项。

\n