CGWindowListCopyWindowInfoではwindowID(=windowNumber)やwindowNameやらを取得できるから、Classの初期化時に一度だけDesktopのwindowIDを探し出してインスタンス変数に収めておけばいいのでは、という方針で行く。
そこでこんな風にやってみる。
CFArrayRef list =CGWindowListCopyWindowInfo( kCGWindowListOptionAll , kCGNullWindowID); for (i=0; i < CFArrayGetCount(list); i++) { w = CFArrayGetValueAtIndex(list, i); windowName=CFDictionaryGetValue(w, kCGWindowName); if([(NSString *)windowName isEqualToString:@"Desktop"]){ CFNumberGetValue(CFDictionaryGetValue(w, kCGWindowNumber),kCGWindowIDCFNumberType, &spot_window_id); desktopID=(NSUInteger)spot_window_id; } }これでたしかにDesktopのwindowIDが取れるわけだが・・・desktopIDに入るのは「2」ですな、私の環境の場合。残念ながらこれは「Desktopという名前をもつWindowのwindowID」であって、現実のOSXのデスクトップではないらしい。 xcatsan師匠作の「windowList.app」で調べてみると、たしかにDesktopのwindowIDは「2」。しかし現実のデスクトップはwindowIDが「11」の、FinderをOwnerにもつ無名のウィンドウらしい。うへー、名前なしか。どうやって特定しよう。いつでも必ず11だっていうことなら、 #define DESKTOP_ID 11 とかしちゃえば早い。実際に実験してみたらこれでも動く。しかし11じゃないことだってありそうだ。 ということで、Ownerが「Finder」、ウィンドウのサイズがフルスクリーン、という条件で絞り出してみる。
CFArrayRef list =CGWindowListCopyWindowInfo( kCGWindowListOptionAll , kCGNullWindowID); CGRect screenRect=NSRectToCGRect([[NSScreen mainScreen] frame]); for (i=0; i < CFArrayGetCount(list); i++) { w = CFArrayGetValueAtIndex(list, i); windowOwnerName=CFDictionaryGetValue(w, kCGWindowOwnerName); //NSLog(@"winName=%@",windowOwnerName); if([(NSString *)windowOwnerName isEqualToString:@"Finder"]){ CGRectMakeWithDictionaryRepresentation(CFDictionaryGetValue(w, kCGWindowBounds), &rect); if (CGRectEqualToRect(rect ,screenRect)) { CFNumberGetValue(CFDictionaryGetValue(w, kCGWindowNumber),kCGWindowIDCFNumberType, &spot_window_id); //NSLog(@"Desktop WindowID=%d",spot_window_id); desktopID=(NSUInteger)spot_window_id; } } }
これでwindowIDが「11」となった。ちょっとあやふやな方法だけど、フルスクリーンのFinderウィンドウは極めてまれだろうから、一応よしとしよう。
0 件のコメント:
コメントを投稿