列挙条件メモ

あるウィンドウが列挙条件を満たしていたとき、そのオーナは列挙されない。

このサイトの2002年12月06日の記事は参考になった。この記事では二回呼び出して比較をしてる。やっぱり、みんな同じところでつまづくのな。

上の記事で書かれていないのはWS_EX_APPWINDOW。これを忘れるとまずい。WS_EX_TOOLWINDOWでもWS_EX_APPWINDOWを持っていれば列挙される。

あらすじ(?)

EnumWindowsで列挙されるものはトップレベルウィンドウなんだけど、見えないウィンドウが混じっていたり、ダイアログが混じっていたりする。ALT+TAB(TaskSwitcher)はこれらの中から、必要なものだけを取り出して表示する。 「必要なものだけ」これを絞りこむことが難しい。(あらすじ)

親とオーナ

親ウィンドウには二種類あって、「子供を持っている正当(?)な親」と「子供を持たない親」の二種類がある。子供をもたない親は親と呼ばず、オーナと呼ぶ。

「親を持つウィンドウ(子供)」は列挙されないが、「オーナを持つウィンドウ」は列挙される可能性がある。

「オーナを持つウィンドウ」には、「隠しウィンドウを持つもの(TApplicationなど)」や「オーナと同等に扱うもの(WinampのPlaylistなど)」や「ダイアログ(プロパティ(モーダレス)や設定ダイアログ(モーダル) )」がある。

「隠しウィンドウ」はオーナを列挙せず、「オーナと同等」は前面にある側を列挙し、「モーダルやプロパティ」の場合はオーナを列挙しない。

ウィンドウスタイル

ウィンドウスタイルで絞り込む場合は、無効か、可視か、AppWindowか、ToolWindowかの四点。無効はWS_DISABLEDを、可視はWS_VISIBLEを*1、AppWindowかはWS_EX_APPWINDOWを、ToolWindowかはWS_EX_TOOLWINDOWをチェックすることでわかる。

無効なら列挙せず、可視なら列挙し、AppWindowなら列挙し、ToolWindowなら列挙しない。

優先度は今書いた順で、有効でなければ可視であっても列挙されず、TOOLWINDOWであってもAPPWINDOWであれば列挙されるといった風だ。これらのスタイルによる絞りこみはオーナにもオーナを持つウィンドウにも有効だ。

で、現在の状況

上記、条件(あくまで推測)を目指して作った結果、TOKKY.COMさんで報告されていたプロパティの件(060216)は、直ったと思います。あと上記の条件で満たせていないのは、WinampWinampのような「オーナと同等」の場合の前面側をアクティブにするという条件がまだうまく実現できない。

先に紹介したサイトと逆の方法(?)をとっていて、一回目のEnumWindowsで「オーナを持つウィンドウ」を列挙して、二回目のEnumWindowsで「オーナ」を列挙し一回目で列挙した「オーナを持つウィンドウのオーナ」と比較し同じなら追加しない*2。つまり、「オーナを持つウィンドウ」が優先されるわけです。これだと、先に紹介したサイトのようにTApplication部分のロジックでは困りません。ただし、Winampは常にPlaylist側のみが列挙されるわけです。あーこまった。

*1:最小化されている場合にWS_VISIBLEがなくなる気がする

*2:この「追加しない」の部分を場合によっては追加する、とすればうまくいくようないかないような