Возвращает их в Z-порядке. Сначала самое верхнее окно с установленным WS_EX_TOPMOST
, до самого нижнего окна с WS_EX_TOPMOST set
, затем самое верхнее окно без WS_EX_TOPMOST
, хотя и до самого нижнего окна без WS_EX_TOPMOST
. Обратите внимание, что видимость не является определяющим фактором, поэтому невидимое окно, которое в Z-порядке выше, чем видимое, все равно будет отображаться перед ним.
EDIT
Маловероятно, что вы можете использовать это как хотите, просто взяв первый возврат из EnumWindows
. Мало того, что ваше новое окно вряд ли будет первым возвратом, но у вас будет состояние гонки, когда другие окна могут быть открыты в то же время. Однако вы можете сохранить список всех известных окон для приложения, и когда вам нужно найти вновь открытое окно, вызовите EnumWindows
и сравните дескрипторы окон с теми, что в вашем списке. Когда вы найдете тот, который имеет правильный класс и заголовок (вы можете даже проверить, что он принадлежит к правильному процессу с GetWindowThreadProcessID
), то есть , а не в вашем списке, то вы нашли новое окно.
Для ваших целей, однако, вам может быть даже лучше, если вы установите ловушку CBT и наблюдаете за уведомлением HCBT_CREATEWND. См. Справку MSDN по SetWindowsHookEx()
и обратному вызову CBTProc
для получения дополнительной информации.
Уровень определенности порядка перечисления :
В ряде комментариев и других ответов на этот вопрос упоминалось отсутствие точной документации в MSDN о порядке, в котором EnumWindows
возвращает дескрипторы окон. И действительно, страницы EnumWindows
и EnumWindowsProc
callback оба довольно молчаливы по этому вопросу. В качестве доказательства предлагаю следующее:
A C ++ В статье вопросов и ответов в журнале MSDN конкретно указано:
EnumWindows перечисляет окна в Z-порядке сверху вниз
Страница на EnumChildWindows
ссылается на порядок в разделе замечаний:
Дочернее окно, которое перемещается или перемещается в Z-порядке во время процесса перечисления, будет правильно перечислено.
Это означает, что порядок зависит от Z-порядка. И поскольку в описании параметра hWndParent указано следующее:
Если этот параметр имеет значение NULL, эта функция эквивалентна EnumWindows.
Можно предположить, что та же логика и порядок применимы к EnumWindows
.
- Это наблюдаемое поведение этой функции, которое делает ее серьезным изменением. В целом, Microsoft была очень хороша в том, чтобы не вносить существенных изменений в наблюдаемое поведение. Это не гарантия, но это довольно безопасная ставка. Скорее всего, вы обнаружите, что в следующей версии используемая вами функция устарела и заменена еще одной версией «Ex», чем обнаружите, что ее наблюдаемое поведение изменилось.
Конечно, на данный момент все это очень академично, поскольку EnumWindows
, вероятно, не лучшее решение проблемы ОП - по крайней мере, EnumThreadWindows
, вероятно, будет лучше, - но я подумал, что оно того стоило упоминание для других людей, которые могут встретить этот пост.