我正在寻找一种类似于CamTwist“桌面+”功能的方式来获取窗口内容。这可以捕获任何窗口,即使它在后台也可以。
苹果的OpenGLScreenCapture示例展示了如何从主屏幕捕获,但无法从隐藏的表面捕获。
你有没有想到CamTwist是如何访问NSWindow的像素缓冲区的呢?
苹果的OpenGLScreenCapture示例展示了如何从主屏幕捕获,但无法从隐藏的表面捕获。
你有没有想到CamTwist是如何访问NSWindow的像素缓冲区的呢?
/* Create an image containing a composite of the specified set of windows
contained within a rectangular area. The set of windows is specified
using options from `CGWindowListOption', along with an optional
additional window ID.
The windows list options are:
--- kCGWindowListOptionAll, kCGWindowListOptionOnScreenOnly: Use all
on-screen windows in this user session to construct the image. The
parameter `windowID' should be `kCGNullWindowID'.
--- kCGWindowListOptionOnScreenAboveWindow: Use all on-screen windows in
this user session above the window specified by `windowID', ordered from
front to back, to construct the image. To include the window specified by
`windowID', add the flag `kCGWindowListOptionIncludingWindow'.
--- kCGWindowListOptionOnScreenBelowWindow: Use all on-screen windows in
this user session below the window specified by `windowID', ordered from
front to back, to construct the image. To include the window specified by
`windowID', add the flag `kCGWindowListOptionIncludingWindow'.
--- kCGWindowListOptionIncludingWindow: Use only the window specified by
`windowID' to construct the image.
The parameter `screenBounds' specifies the rectangle in screen space
(origin at the upper-left; y-value increasing downward). Setting
`screenBounds' to `CGRectInfinite' will include all the windows on the
entire desktop. Setting `screenBounds' to `CGRectNull' will use the
bounding box of the specified windows as the screen space rectangle.
中断
/* The parameter `imageOptions' allows you to specify whether the window
frame ornamentation, such as a shadow or similar effect, should be
included or excluded in the bounds calculation when `CGRectNull' is
specified for the window bounds.
If no windows meet the specified criteria, or the windows can't be read,
then a transparent black image will be returned.
Any on-screen window with sharing type `kCGWindowSharingNone' will not
be included in the image.
This function returns NULL if the caller is not running within a Quartz
GUI session or the window server is disabled. */
CG_EXTERN CGImageRef CGWindowListCreateImage(CGRect screenBounds,
CGWindowListOption listOption, CGWindowID windowID,
CGWindowImageOption imageOption)
CG_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
/* Create an image containing a composite of the specified set of windows
contained within a rectangular area à la `CGWindowListCreateImage'. The
set of windows is specified by `windowArray', an array of window IDs. */
CG_EXTERN CGImageRef CGWindowListCreateImageFromArray(CGRect screenBounds,
CFArrayRef windowArray, CGWindowImageOption imageOption)
CG_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
抱歉,无法在苹果官网上找到文档链接。然而,他们似乎在Son of Grab中提供了示例代码。