I'm looking for a way to grab the contents of a window like CamTwist 'Desktop+' feature. This can grab any window, even when its in the background.
Apple's OpenGLScreenCapture sample shows how to capture from the main screen but not from hidden surfaces.
Any idea how CamTwist gets access to the pixel buffer of an NSWindow?
AFAIK, the official APIs can be found in CGWindow.h as part of CoreGraphics:
/* 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.
break
/* 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);
Sorry, could not find a link to the documentation on Apple's site. However, they do appear to have sample code in Son of Grab.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With