ページ

2008年8月25日月曜日

マウスカーソルのキャプチャ (11)

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

さて今回はウィンドウ(Windows)。

まず結果から。



元々ウィンドウでは Window というクラスを用意し CGWindowListCopyWindowInfo( ) から取得した情報を管理していた。CGWindowListCopyWindowInfo( )の結果は CFDictionary 形式で値の取り出しは関数を使う必要があり、扱いづらいというのがその理由。これを拡張して座標管理も行なうようにした。

Window.h


@interface Window : NSObject {
int _order;
CGWindowID _window_id;
int _owner_pid;
NSString* _window_name;
NSString* _owner_name;
int _layer;
NSRect _rect;
NSImage* _image;

}


その結果、ほとんどの情報を Windowへ載せ替えるようなラッパーコードに近いものとなった(*)。ただその分実装は楽になった。
(*)実際にはラッパー以外の、例えばウィンドウ画像を扱うような機能、並び順管理などの機能も持たせている。

こんなコードだったのが
CFArrayRef window_list = CGWindowListCopyWindowInfo((kCGWindowListOptionOnScreenOnly|kCGWindowListOptionOnScreenBelowWindow|kCGWindowListExcludeDesktopElements), window_id);
for (i=0; i < CFArrayGetCount(window_list); i++) {
window = CFArrayGetValueAtIndex(window_list, i);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber),
kCGWindowIDCFNumberType, &_window_id);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowOwnerPID),
kCFNumberIntType, &_owner_pid);
CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowLayer),
kCFNumberIntType, &_layer);



ずいぶんとスッキリ書ける様になった。
NSArray *list = [self getWindowAllList];
for (Window* window in list) {
window_id = [window windowID];
owner_pid = [window ownerPID];
layer = [window layer];





これによって最後にキャプチャ対象の Windowの _rect を合成し、キャプチャ画像の最終座標を求めることができるようになった。この最終座標を使ってマウスカーソルを合成してやる。