べんりーい食品工業株式会社

の「健康を考える人の弁当」にソルビン酸が入ってた。


EnumWindows に就いて。


取得されるトップレベルウィンドウは 3 パターンある様だ。


パターン 1. GetParent() == NULL のパターン。
GetAncestor( GA_PARENT ) == GetDesktopWindow()
GetWindow( GW_OWNER ) == NULL
GetAncestor( GA_ROOT ) == 自分
GetAncestor( GA_ROOTOWNER ) == 自分


パターン 2. GetParent() == GetDesktopWindow() のパターン。
GetAncestor( GA_PARENT ) == GetDesktopWindow()
GetWindow( GW_OWNER ) == NULL
GetAncestor( GA_ROOT ) == 自分
GetAncestor( GA_ROOTOWNER ) == GetDesktopWindow()


パターン 3. GetParent() == GetWindow( GW_OWNER ) のパターン。
GetAncestor( GA_PARENT ) == GetDesktopWindow()
GetWindow( GW_OWNER ) == GetParent()
GetAncestor( GA_ROOT ) == 自分
GetAncestor( GA_ROOTOWNER ) == GetParent() or more


3 つのパターンに共通している事は、GetAncestor( GA_PARENT ) == GetDesktopWindow(), GetAncestor( GA_ROOT ) == 自分、だ。

パターン 1. では SetParent( NULL ) としているのだろう。
パターン 2. では SetParent( GetDesktopWindow()) として、WS_CHILD 持ちっぽい。
パターン 3. では SetParent( !GetDesktopWindow()) として、WS_POPUP 持ちっぽい。


ポイントは SetParent() と WS_CHILD or WS_POPUP なのだろうなあ。
SetParent() で NULL, GetDesktopWindow(), !GetDesktopWindow() という 3 通りがあり、WS_CHILD であるのか WS_POPUP であるのかで 2 通りがある。掛けると 6 通りか。
WS_CHILD と WS_POPUP って排他だった気がするけど、そうじゃ無いとしたら、
a. WS_CHILD | WS_POPUP
b.
c. WS_CHILD
d. WS_POPUP
の 4 通りになるのか。そうなると 3 掛ける 4 で 12 通りか。どうなんだ。
取り敢えず、!GetDesktopWindow() を SetParent() して、WS_CHILD だけを持っている場合は、トップレベルウィンドウでは無いという事は確実なのだろうなあ。
あ、!GetDesktopWindow() という表現は NULL でもデスクトップでも無い普通のウィンドウを意味している積もりです。


EnumThreadWindows ではコンソールウィンドウは列挙されません。EnumWindows では出ます。
EnumChildWindows では、そのウィンドウの子ウィンドウだけでなく、孫ウィンドウも列挙されるそうだ。孫の子も列挙されるのだろうなあ、多分。これは !GetDesktopWindow() を指定した場合。
EnumChildWindows に NULL を指定すると、EnumWindows と同じ動作になるっぽい。ドキュメントに書かれてた。
EnumChildWindows に GetDesktopWindow() を指定すると、EnumWindows と同じ動作になるっぽい。ドキュメントに書かれている様な気がしなくもない。


WS_EX_APPWINDOW, WS_EX_MDICHILD, WS_EX_TOOLWINDOW, WS_EX_TOPMOST も気になるねえ…。


知らない事って沢山有りますよねえ…。