ページ

2008年6月10日火曜日

メニューのキャプチャ(その2)

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

実際にメニューのキャプチャをやってみよう。まずはタイマーと CGWindowListCopyWindowInfo( ) を使って目的のウィンドウを特定する。

サンプルアプリを用意した。ボタンを押すと5秒後にウィンドウの一覧を CGWindowListCopyWindowInfo( ) で取得し、kCGWindowLayer = kCGPopUpMenuWindowLevel (101) のものだけログへ出力する。


ソース:MenuCapture-01.zip

実行時の様子。


ウィンドウ情報が得られた。

kCGWindowAlpha = 1;
kCGWindowBounds = {
Height = 189;
Width = 219;
X = 45;
Y = 22;
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 101;
kCGWindowMemoryUsage = 234136;
kCGWindowName = "\Uf8ff";
kCGWindowNumber = 112307;
kCGWindowOwnerName = MenuCapture;
kCGWindowOwnerPID = 36446;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
}



ソースコードはこんな感じ。今までのものをそのまま流用しただけ。
AppController.m
- (void)fire:(NSTimer*)theTimer
{
static int t = 5;
if (t < 0) {
t = 5;
}
[_text setStringValue:[NSString stringWithFormat:@"%d", t]];
t--;
if (t < 0) {
[theTimer invalidate];
[_text setStringValue:[NSString stringWithFormat:@"%d", 0]];

UInt32 option = kCGWindowListOptionOnScreenOnly;
CFArrayRef list =CGWindowListCopyWindowInfo(option, kCGNullWindowID);
CFDictionaryRef w;
CFIndex i;
int layer;

for (i=0; i < CFArrayGetCount(list); i++) {
w = CFArrayGetValueAtIndex(list, i);
CFNumberGetValue(CFDictionaryGetValue(w, kCGWindowLayer),
kCFNumberIntType, &layer);

if (layer == kCGPopUpMenuWindowLevel) {
NSLog(@"%@", w);
}
}
}
}


- - - -
次回は得た情報を元にキャプチャ画像を作成する。