ページ

2009年2月8日日曜日

デスクトップアイコンを消す(その1)Selection編

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

シェアウェアにデスクトップアイコンを一時的に消すソフトがあるらしい。面白い。SimpleCapでもこれをやってみよう。
まずは Selectionから。

プリファレンスで制御できるようにする。





実際にキャプチャしてみよう。まずは通常のキャプチャ。デスクトップアイコンが写っている。


プリファレンスで "Exclude Desktop Icons"を選びキャプチャ。アイコンがそっくり消えている。


- - - -
デスクトップアイコンを消すのは簡単で CGWindowListCreateImage( )関数の CGWindowImageOption引数へ kCGWindowListExcludeDesktopElements を加えれば良い。ただこのオプションは背景画像まで取り除いてしまう。

そこでこのオプションを使ってキャプチャした後、背景画像を合成してやる。デスクトップ画像は以前マルチスクリーン対応で用意した DesktopWindowクラスを使うと比較的容易に作れる。

NSArray* desktop_window_list = [[DesktopWindow sharedDesktopWindow] CGWindowIDlist];
CGWindowID *windowIDs = calloc([desktop_window_list count], sizeof(CGWindowID));
int widx = 0;
for (NSNumber* num in desktop_window_list) {
windowIDs[widx++] = [num unsignedIntValue];
}
CFArrayRef windowIDsArray = CFArrayCreate(kCFAllocatorDefault, (const void**)windowIDs, widx, NULL);
CGImageRef cgimage_desktop = CGWindowListCreateImageFromArray(NSRectToCGRect(_rect), windowIDsArray, kCGWindowImageDefault);


これを別途キャプチャした画像と合成すれば良い。 こんな感じ。
NSBitmapImageRep *bitmap_desktop = [[[NSBitmapImageRep alloc] initWithCGImage:cgimage_desktop] autorelease];
NSImage* image_desktop = [[[NSImage alloc] init] autorelease];
[image_desktop addRepresentation:bitmap_desktop];
[image_desktop lockFocus];
[src_image drawAtPoint:NSZeroPoint
fromRect:NSZeroRect
operation:NSCompositeSourceOver fraction:1.0];
[image_desktop unlockFocus];
src_image = image_desktop;