ページ

2008年9月18日木曜日

環境設定(9)

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

前回の続き。

SimpleCapではキャプチャ処理をハンドラの基底クラスにあたる HandlerBase で行っている。

※クラス構成は過去のブログをどうぞ:SimpleCap (2) - 基本機能実装


具体的には各ハンドラはキャプチャ実行時に、Windowクラスのリスト(CGWindowIDを含む)と矩形領域(CGRect)を HandlerBase#cgimageWihWindowList:cgrectへ渡して、CGImageを取得する。

HandlerBase.m

- (CGImageRef)cgimageWithWindowList:(NSArray*)list cgrect:(CGRect)cgrect
{
   :


この中で画像キャプチャを行う CGWindowListCreateImageFromArray( ) を呼出している。つまりここを押さえれば出力の画像を自由にできる。今回はここに背景画像の合成処理を加えた。といって背景(壁紙)の CGWindowID を CGWindowListCreateImageFromArray( )に渡す配列に加えるだけで簡単にできる。

   :
BOOL is_background = [[UserDefaults valueForKey:UDKEY_BACKGROUND] boolValue];   // (1)
   :
if (is_background) {
windowIDs[widx++] = [Window desktopWindowID];      // (2)
}
   :
CFArrayRef windowIDsArray = CFArrayCreate(kCFAllocatorDefault, (const void**)windowIDs, widx, NULL);
CGImageRef cgimage = CGWindowListCreateImageFromArray(cgrect, windowIDsArray, option);
free(windowIDs);


UserDefaultsから設定を取り出し、それによって背景のCGWindowIDを Window#desktopWindowID から取得して、CGWindowListCreateImageFromArray( )へ渡す配列へ加えている(1)(2)。

背景のCGWindowIDは WindowList(自作ソフト)を使って調べると"DeskTop"という名前がついていて、"Window Server"という名前のプロセスによって作成されているのが分かる。


Window#desktopWindowID は安易にこの名前を使って CGWindowIDを決定する(もっといい方法があれば是非教えて下さい)。

Window.m
static _desktop_windowID = -1;
+ (CGWindowID)desktopWindowID
{
if (_desktop_windowID != -1) {
return _desktop_windowID;
}

CFArrayRef ar = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
CFDictionaryRef window;
CFIndex i;

_desktop_windowID = kCGNullWindowID;
for (i=0; i < CFArrayGetCount(ar); i++) {
window = CFArrayGetValueAtIndex(ar, i);
NSString* name = (NSString*)CFDictionaryGetValue(window, kCGWindowName);
NSString* owner_name = (NSString*)CFDictionaryGetValue(window, kCGWindowOwnerName);
if ([name isEqualToString:@"Desktop"] && [owner_name isEqualToString:@"Window Server"]) {
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber),
kCGWindowIDCFNumberType, &_desktop_windowID);
break;
}
}
return _desktop_windowID;
}


これで、できあがり。

これが。


こうなる。


- - - -
ほ。今日もブログはぎりぎり間に合った。
最近は仕事が忙しくてかなわない。