前回の続き。NSBitmapImageRep#initWithFocusedViewRect ではうまく行かなかったので今回は CGWindowListCreateImage( )を使ってみる。
MyView.h
NSString* path = [NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString* filename = [path stringByAppendingPathComponent:@"sample_shot.png"];
CGRect rect = CGRectMake(_spot_rect.origin.x, _spot_rect.origin.y, _spot_rect.size.width, _spot_rect.size.height);
CGWindowID window_id = (CGWindowID)[[self window] windowNumber];
CGImageRef cgimage = CGWindowListCreateImage(rect, kCGWindowListOptionOnScreenBelowWindow, window_id, kCGWindowImageDefault);
NSBitmapImageRep *bitmap_rep = [[NSBitmapImageRep alloc] initWithCGImage:cgimage];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];
[data writeToFile:filename atomically:YES];
[bitmap_rep release];
CGWindowListCreateImage には選択範囲 rect、CGWindowIDにはアプリのウィンドウ(透明)を指定する。その上で kCGWindowListOptionOnScreenBelowWindow オプションを指定するとアプリウィンドウより下のウィンドウ群が対象になる。
さて、結果は?
うまくできた。
ソース:FullScreenSample-6.zip