ページ

2008年6月16日月曜日

メニューのキャプチャ(その8)メニューバーを含める(2)

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

前回メニューバーを入れるようにしたがコンテキストメニューのキャプチャでも入るようになってしまった。コンテキストメニューの場合はメニューバーを入れないようにする。


コンテキストメニューかどうかはウィンドウ名でしか判別できないようなのでこれで判断する。ちょっと泥臭いが手を加える。
AppController.m

  int menubar_window_id;

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

if (layer == kCGPopUpMenuWindowLevel) {
NSString *window_name = (NSString*)CFDictionaryGetValue(w, kCGWindowName);
if ([window_name isEqualToString:@"ContextMenu"]) {
is_contextmenu = YES;
}
CGRectMakeWithDictionaryRepresentation(CFDictionaryGetValue(w, kCGWindowBounds), &rect);
if (CGRectEqualToRect(rect_all,CGRectZero)) {
rect_all = rect;
} else {
rect_all = CGRectUnion(rect, rect_all);
}
windowIDs[widx++] = window_id;
} else if (layer == kCGMainMenuWindowLevel) {
menubar_window_id = window_id;
}
}
if (!is_contextmenu) {
windowIDs[widx++] = menubar_window_id;
rect_all = CGRectUnion(CGRectZero, rect_all);
rect_all.size.width += 20;
rect_all.size.height += 25;
} else {
rect_all = CGRectNull;
}


これでOK。


ソース:MenuCapture-05.zip