(Many thanks to Paul Sobolik for giving us this an updated and more reliable version)- (NSImage *) captureScreenImageWithFrame: (NSRect) frame { // Fetch a graphics port of the screen CGrafPtr screenPort = CreateNewPort (); Rect screenRect; GetPortBounds (screenPort, &screenRect); // Make a temporary window as a receptacle NSWindow *grabWindow = [[NSWindow alloc] initWithContentRect: frame styleMask: NSBorderlessWindowMask backing: NSBackingStoreRetained defer: NO screen: nil]; CGrafPtr windowPort = GetWindowPort ([grabWindow windowRef]); Rect windowRect; GetPortBounds (windowPort, &windowRect); SetPort (windowPort); // Copy the screen to the temporary window CopyBits (GetPortBitMapForCopyBits(screenPort), GetPortBitMapForCopyBits(windowPort), &screenRect, &windowRect, srcCopy, NULL); // Get the contents of the temporary window into an NSImage NSView *grabContentView = [grabWindow contentView]; [grabContentView lockFocus]; NSBitmapImageRep *screenRep; screenRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect: frame]; [grabContentView unlockFocus]; NSImage *screenImage = [[NSImage alloc] initWithSize: frame.size]; [screenImage addRepresentation: screenRep]; // Clean up [grabWindow close]; DisposePort(screenPort); return (screenImage); } // captureScreenImageWithFrame