ページ

2008年3月10日月曜日

画面キャプチャその10 - Widgetの取り込み(1)

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

次は Widget のキャプチャに挑戦してみる。が、その前に CGWindowListCopyWindowInfo() で取得できる情報を一度整理してみる。

以前の検証ではウィンドウ毎に次の種類の情報が取得できることが分かっている。

 kCGWindowAlpha = 1;
kCGWindowBounds = {
Height = 22;
Width = 322;
X = 1072;
Y = 0;
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 25;
kCGWindowMemoryUsage = 41820;
kCGWindowName = "";
kCGWindowNumber = 19;
kCGWindowOwnerName = SystemUIServer;
kCGWindowOwnerPID = 119;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;


それぞれの意味は CGWindow.h に説明がある。


さて、まずは Widgetのウィンドウがこの関数で取得できるのかを検証してみる。検証用のコードを書いてみた。

ソース:ScreenList.zip

実行すると5秒間隔でデバッガコンソールへ CGWindowListCopyWindowInfo の結果一覧を表示する。



では実行してみる。まずは Widgetなしの状態。

2008-03-02 09:34:14.311 ScreenList[12260:10b] 00000119: SystemUIServer, , (1111,0,283,22)
2008-03-02 09:34:14.312 ScreenList[12260:10b] 00000110: Spotlight, , (1394,0,46,22)
2008-03-02 09:34:14.314 ScreenList[12260:10b] 00000119: SystemUIServer, (null), (0,0,1440,22)
2008-03-02 09:34:14.315 ScreenList[12260:10b] 00000061: Window Server, Shared Menubar, (0,0,1440,22)
2008-03-02 09:34:14.315 ScreenList[12260:10b] 00000115: Dock, (null), (0,22,1440,878)
2008-03-02 09:34:14.316 ScreenList[12260:10b] 00000115: Dock, Magic Mirror, (209,851,1023,49)
2008-03-02 09:34:14.316 ScreenList[12260:10b] 00002477: EasyCalendar, Window, (-4,814,213,150)
2008-03-02 09:34:14.317 ScreenList[12260:10b] 00012260: ScreenList, Window, (335,128,252,166)
2008-03-02 09:34:14.317 ScreenList[12260:10b] 00012127: Xcode, ScreenList — デバッガコンソール, (489,47,794,792)
2008-03-02 09:34:14.318 ScreenList[12260:10b] 00012127: Xcode, MyController.m, (771,215,675,587)
 :
 :


表示情報は左から kCGWindowOwnerPID、kCGWindowOwnerName、kCGWindowName、kCGWindowBounds(x,y,w,h)。
画面の重なり順に表示されるので、リストの一番上が画面でも一番上のウィンドウとなる。

この状態で Widgetを表示させると...

2008-03-02 09:34:19.312 ScreenList[12260:10b] 00000115: Dock, (null), (10,855,36,36)
2008-03-02 09:34:19.312 ScreenList[12260:10b] 00000115: Dock, (null), (1258,648,172,248)
2008-03-02 09:34:19.317 ScreenList[12260:10b] 00000115: Dock, (null), (177,241,510,473)
2008-03-02 09:34:19.317 ScreenList[12260:10b] 00000115: Dock, (null), (727,401,381,49)
2008-03-02 09:34:19.318 ScreenList[12260:10b] 00000115: Dock, (null), (0,0,1440,900)
2008-03-02 09:34:19.318 ScreenList[12260:10b] 00000119: SystemUIServer, , (1111,0,283,22)
2008-03-02 09:34:19.319 ScreenList[12260:10b] 00000110: Spotlight, , (1394,0,46,22)
2008-03-02 09:34:19.319 ScreenList[12260:10b] 00000119: SystemUIServer, (null), (0,0,1440,22)
2008-03-02 09:34:19.319 ScreenList[12260:10b] 00000061: Window Server, Shared Menubar, (0,0,1440,22)
2008-03-02 09:34:19.320 ScreenList[12260:10b] 00000115: Dock, (null), (0,22,1440,878)
2008-03-02 09:34:19.320 ScreenList[12260:10b] 00000115: Dock, Magic Mirror, (209,851,1023,49)
2008-03-02 09:34:19.321 ScreenList[12260:10b] 00002477: EasyCalendar, Window, (-4,814,213,150)
2008-03-02 09:34:19.321 ScreenList[12260:10b] 00012260: ScreenList, Window, (335,128,252,166)
2008-03-02 09:34:19.322 ScreenList[12260:10b] 00012127: Xcode, ScreenList — デバッガコンソール, (489,47,794,792)
2008-03-02 09:34:19.322 ScreenList[12260:10b] 00012127: Xcode, MyController.m, (771,215,675,587)
 :
 :


"Dock"という名のウィンドウが5つほど増えている。この時の Widget表示は次のようになっていた。



最初の 36x36は左下の十字アイコンだと思われる。
2008-03-02 09:34:19.312 ScreenList[12260:10b] 00000115: Dock, (null), (10,855,36,36)


続く3つのウィンドウはそれぞれ画面に表示されている Widget。
2008-03-02 09:34:19.312 ScreenList[12260:10b] 00000115: Dock, (null), (1258,648,172,248)
2008-03-02 09:34:19.317 ScreenList[12260:10b] 00000115: Dock, (null), (177,241,510,473)
2008-03-02 09:34:19.317 ScreenList[12260:10b] 00000115: Dock, (null), (727,401,381,49)


最後の 1400x900 は画面を覆っている黒い半透明のウィンドウだろう。
2008-03-02 09:34:19.318 ScreenList[12260:10b] 00000115: Dock, (null), (0,0,1440,900)


つまり Widgetのウィンドウも問題なく取得できるということだ。加えてWidgetが特別な仕組みを使っている訳ではないことも分かった。イメージはこんな感じ?


- - - -
Widgetのウィンドウも問題なく取得できることが確認できたので次回は以前のサンプルを改造して Widgetのキャプチャを行ってみる。