它按 Z 顺序返回它们。首先是带有WS_EX_TOPMOST
set 的最顶部的窗口,直到带有 的最底部的窗口WS_EX_TOPMOST set
,然后是没有 的最顶部的窗口WS_EX_TOPMOST
,尽管是没有 的最底部的窗口WS_EX_TOPMOST
。请注意,可见性不是决定因素,因此在 Z 顺序中高于可见窗口的不可见窗口仍将出现在其之前。
编辑:
您不太可能随心所欲地使用它,只需从EnumWindows
. 不仅您的新窗口不太可能是第一次返回,而且您还会遇到其他窗口可以同时打开的竞争条件。但是,您可以保留应用程序所有已知窗口的列表,当您需要查找新打开的窗口时,调用EnumWindows
窗口句柄并将其与列表中的句柄进行比较。当您找到一个没有在您的列表中的具有正确类和标题(您甚至可以使用 来检查它是否属于正确的进程GetWindowThreadProcessID
)时,您就找到了新窗口。
但是,出于您的目的,安装 CBT 挂钩并注意 HCBT_CREATEWND 通知可能会更好地为您服务。有关详细信息,请参阅 MSDN 帮助SetWindowsHookEx()
和回调。CBTProc
枚举顺序的确定程度:
对此问题的许多评论和其他答案都提到了 MSDN 中缺乏关于EnumWindows
返回窗口句柄顺序的精确文档。事实上,页面EnumWindows
和回调都对这个问题保持沉默。EnumWindowsProc
我提供以下证据:
MSDN 杂志中的一篇 C++ Q&A 文章确实明确指出:
EnumWindows 以自上而下的 Z 顺序枚举窗口
页面上EnumChildWindows
暗指备注部分的订单:
在枚举过程中按 Z 顺序移动或重新定位的子窗口将被正确枚举。
这意味着顺序是 Z 顺序相关的。因为,在hWndParent参数的描述中,它说:
如果此参数为 NULL,则此函数等效于 EnumWindows。
可以假设相同的逻辑和顺序适用于EnumWindows
.
- 这是此函数的可观察行为,这使得对其进行更改是一项重大更改。总的来说,微软在不对可观察行为进行重大更改方面做得很好。这不是保证,但这是一个非常安全的赌注。您更有可能发现在下一个版本中您正在使用的功能已被弃用——并被另一个“Ex”版本取代——而不是发现它的可观察行为发生了变化。
当然,在这一点上这都是非常学术的,因为EnumWindows
可能不是解决 OP 问题的最佳解决方案——至少EnumThreadWindows
可能更合适——但我认为对于可能遇到这个问题的其他人来说值得一提邮政。