ウィンドウリストからステータスバーの位置を割り出すことにした。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のラッパークラス。
これで位置が取れた。キャプチャ後にファイル名を表示させてみる。
おお、出た。