Zオーダーで返します。最初にがWS_EX_TOPMOST
設定された一番上のウィンドウ、次にが付いた一番下のウィンドウWS_EX_TOPMOST set
、次にが付いていない一番上のウィンドウまで、。WS_EX_TOPMOST
がない一番下のウィンドウまでWS_EX_TOPMOST
。可視性は決定要因ではないため、可視ウィンドウよりもZオーダーが高い不可視ウィンドウがその前に表示されることに注意してください。
編集:
から最初のリターンを取得するだけで、これを希望どおりに使用できる可能性はほとんどありませんEnumWindows
。新しいウィンドウが最初に戻る可能性が低いだけでなく、その間に他のウィンドウを開くことができる競合状態が発生する可能性があります。ただし、アプリケーションのすべての既知のウィンドウのリストを保持することはできます。新しく開いたウィンドウを見つける必要がある場合は、ウィンドウハンドルを呼び出しEnumWindows
て、リスト内のウィンドウハンドルと比較します。リストにない正しいクラスとキャプション(で正しいプロセスに属していることを確認することもできますGetWindowThreadProcessID
)を持つものを見つけると、新しいウィンドウが見つかります。
ただし、あなたの目的のために、CBTフックをインストールし、HCBT_CREATEWND通知を監視することで、さらに良いサービスが提供される場合があります。詳細については、 MSDNヘルプSetWindowsHookEx()
とコールバックを参照してください。CBTProc
列挙順序に関する確実性のレベル:
この質問に対する多くのコメントやその他の回答では、EnumWindows
ウィンドウハンドルを返す順序に関するMSDNの正確なドキュメントが不足していると述べています。そして確かに、上のページEnumWindows
とコールバックは両方ともこの問題について非常に沈黙しています。EnumWindowsProc
私は証拠として以下を提供します:
MSDNマガジンのC++Q&A記事には、具体的に次のように記載されています。
EnumWindowsは、ウィンドウをトップダウンのZオーダーで列挙します
のページEnumChildWindows
は、備考セクションの順序をほのめかしています。
列挙プロセス中にZオーダーで移動または再配置された子ウィンドウは、適切に列挙されます。
これは、順序がZオーダーに依存することを意味します。そして、hWndParentパラメータの説明では、次のようになっています。
このパラメーターがNULLの場合、この関数はEnumWindowsと同等です。
同じ論理と順序がに適用されると想定できますEnumWindows
。
- これは、この関数の観察可能な動作であり、それを変更するための重大な変更になります。一般に、Microsoftは、観察可能な動作に重大な変更を加えないことについて非常に優れています。これは保証ではありませんが、かなり安全な方法です。次のバージョンでは、使用している関数が非推奨になり、さらに別の「Ex」バージョンに置き換えられていることに気付く可能性が高くなります。観察可能な動作が変更されていることがわかります。
もちろん、これは現時点ではすべて非常に学術的EnumWindows
です。OPの問題に対する最善の解決策ではない可能性があり、少なくともEnumThreadWindows
より適切である可能性がありますが、これに遭遇する可能性のある他の人々にとっては言及する価値があると思いました。役職。