ページ

2008年6月9日月曜日

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

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

SimpleCapではメニューを簡単にキャプチャしたい。その為の調査を少しずつ行っていく。

まずはメニューがそのように扱われているのか、以前作成したウィンドウリストアプリ(WindowList)で調べてみる。WindowList は画面に表示されているウィンドウのリストを表示するもの。


この以前のプログラムにタイマー機能を持たせてメニューを開いている時のウィンドウリストを見てみよう。


タイマーを仕掛け、メニューを開いてみる。Finder のメニューを開いてみた。


すると WindowList に Layer=101 でメニューが現れた。OwnerNameから Finderのメニューであることがわかる。実際(画像の右側が切れているが)PIDは Finderと同じものを示している。Nameはアップルマークになっている。


この Layer=101 は NSWindowのレベルを示していると思われ、実際ヘッダファイルを見ると定義があった。
CGWindow.h

/* Definitions of older constant values as calls */
#define kCGBaseWindowLevel CGWindowLevelForKey(kCGBaseWindowLevelKey) /* INT32_MIN */
#define kCGMinimumWindowLevel CGWindowLevelForKey(kCGMinimumWindowLevelKey) /* (kCGBaseWindowLevel + 1) */
#define kCGDesktopWindowLevel CGWindowLevelForKey(kCGDesktopWindowLevelKey) /* kCGMinimumWindowLevel */
#define kCGDesktopIconWindowLevel CGWindowLevelForKey(kCGDesktopIconWindowLevelKey) /* kCGMinimumWindowLevel + 20 */
#define kCGBackstopMenuLevel CGWindowLevelForKey(kCGBackstopMenuLevelKey) /* -20 */
#define kCGNormalWindowLevel CGWindowLevelForKey(kCGNormalWindowLevelKey) /* 0 */
#define kCGFloatingWindowLevel CGWindowLevelForKey(kCGFloatingWindowLevelKey) /* 3 */
#define kCGTornOffMenuWindowLevel CGWindowLevelForKey(kCGTornOffMenuWindowLevelKey) /* 3 */
#define kCGDockWindowLevel CGWindowLevelForKey(kCGDockWindowLevelKey) /* 20 */
#define kCGMainMenuWindowLevel CGWindowLevelForKey(kCGMainMenuWindowLevelKey) /* 24 */
#define kCGStatusWindowLevel CGWindowLevelForKey(kCGStatusWindowLevelKey) /* 25 */
#define kCGModalPanelWindowLevel CGWindowLevelForKey(kCGModalPanelWindowLevelKey) /* 8 */
#define kCGPopUpMenuWindowLevel CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey) /* 101 */
#define kCGDraggingWindowLevel CGWindowLevelForKey(kCGDraggingWindowLevelKey) /* 500 */
#define kCGScreenSaverWindowLevel CGWindowLevelForKey(kCGScreenSaverWindowLevelKey) /* 1000 */
#define kCGCursorWindowLevel CGWindowLevelForKey(kCGCursorWindowLevelKey) /* 2000 */
#define kCGOverlayWindowLevel CGWindowLevelForKey(kCGOverlayWindowLevelKey) /* 102 */
#define kCGHelpWindowLevel CGWindowLevelForKey(kCGHelpWindowLevelKey) /* 200 */
#define kCGUtilityWindowLevel CGWindowLevelForKey(kCGUtilityWindowLevelKey) /* 19 */


メニューのレベルは、kCGPopUpMenuWindowLevel (101) で定義されている。ということは Layer=101 (kCGPopUpMenuWindowLevel) を狙い撃ちすればメニューがキャプチャできるかもしれない。


ついでにコンテキストメニューも調べておこう。

タイマーを仕掛けコンテキストメニューを出して見る。


出た。Layer=101で名前は「ContextMenu」。



ソース:WindowList-5.zip