ページ

2008年12月11日木曜日

吹き出しウィンドウ(8)

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

ウィンドウリストからステータスバーの位置を割り出すことにした。NSProcessInfo#processIdentifierで自分のPIDを取得して、これとレイヤー(kCGStatusWindowLevel==25)の2つの条件からステータスバーのウィンドウを割り出す。

+ (Window*)statusBarWindow
{
CFArrayRef ar = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
CFDictionaryRef window_ref;
CFIndex i;
int status_bar_pid = [[NSProcessInfo processInfo] processIdentifier];
int owner_pid;
int layer;

for (i=0; i < CFArrayGetCount(ar); i++) {
window_ref = CFArrayGetValueAtIndex(ar, i);
CFNumberGetValue(CFDictionaryGetValue(window_ref, kCGWindowOwnerPID),
kCFNumberIntType, &owner_pid);
CFNumberGetValue(CFDictionaryGetValue(window_ref, kCGWindowLayer),
kCFNumberIntType, &layer);
if (owner_pid == status_bar_pid && layer == kCGStatusWindowLevel) {
break;
}
}
Window* window = [[[Window alloc] initWithWindowDictionaryRef:window_ref] autorelease];
CFRelease(ar);

return window;
}


Windowクラスは CGWindowListCopyWindowInfo から取得した情報を格納するObjective-Cのラッパークラス。

これで位置が取れた。キャプチャ後にファイル名を表示させてみる。


おお、出た。