Что является альтернативой использованию GetWindow в цикле?

MSDN упоминает следующее замечание для GetWindow() функция.

Функция EnumChildWindows более надежна, чем вызов GetWindow в цикле. Приложение, которое вызывает GetWindow для выполнения этой задачи, рискует попасть в бесконечный цикл или ссылаться на дескриптор окна, которое было уничтожено.

Использование EnumChildWindows прекрасно работает, когда вас интересует только перечисление всех окон. Однако что, если вам нужна дополнительная функциональность z-order, которую предоставляет GetWindow? Я не могу найти все окна, упорядоченные по z-порядку, используя EnumChildWindows.

Означает ли это, что нет «безопасного» способа сделать это?


person Steven Jeuris    schedule 20.10.2012    source источник
comment
См. этот принятый ответ - stackoverflow.com/a/825619/59303   -  person ChrisF    schedule 21.10.2012
comment
@ChrisF GetNextWindow — это макрос для GetWindow.   -  person Steven Jeuris    schedule 21.10.2012
comment
Это действительно так. Я должен был перейти на страницу MSDN.   -  person ChrisF    schedule 21.10.2012


Ответы (1)


Если вам нужен Z-порядок, я бы использовал GetWindow(), но остерегайтесь отмеченных проблем.

Если вы видите окно более одного раза, остановитесь. При последующем обращении к возвращаемому окну через его дескриптор будьте готовы к сбою.

person Ed Staub    schedule 20.10.2012
comment
И как «быть готовым к неудаче»? Проверьте, не уничтожено ли окно в первую очередь? - person Steven Jeuris; 21.10.2012
comment
Конечно, это сработает — например, попробуйте GetParent(), чтобы убедиться, что это реально. Это зависит от ситуации. Если следующий вызов API в этом окне находится в том же фрагменте кода, то вы можете просто захотеть иметь дело с ним при обработке ошибок, каким бы ни был этот вызов. Если окна, с которыми вы имеете дело, на самом деле не очень динамичны (подвергаются уничтожению или Z-переупорядочению, вы можете игнорировать предупреждение. - person Ed Staub; 21.10.2012