Если вам действительно нужны скрытые окна, ваш единственный реальный вариант - самостоятельно пройтись по дереву HWND; все ... FromPoint пропустить это прямо. (Обратите внимание, что скрытые окна могут иметь местоположения, которые в конечном итоге блокируют вас от доступа к видимым окнам «под ними» - так что вы можете подумать о том, действительно ли вы хотите получить доступ к скрытым окнам во всех случаях или только как запасной вариант, если нет другого подходящего видимого окна в точке.)
Используйте GetDesktopWindow (), чтобы начать с корня, и спуститься соответствующим образом; Пройдите через каждого потомка, посмотрите, в этом ли суть, и если да, пройдите по этой ветви и проигнорируйте других братьев и сестер.
Чтобы определить потомков HWND, вы можете использовать либо EnumWindows, либо использовать GetWindow () - но учтите, что GetWindow может дать вам непоследовательные результаты, если окна изменяют zorder во время их перечисления.
Тогда вам решать, как отфильтровать hwnds; если вам нужны только видимые окна, пропустите те, в которых не установлен бит WS_VISIBLE.
Проверка 'точки в этом HWND' сложнее: проверка точки в прямоугольнике окна является первым тестом; но вам также может потребоваться проверить, что он не отвечает HT_TRANSPARENT на WS_EX_TRANSPARENT - это то, что групповые блоки используют, чтобы позволить щелчкам «проходить» к своим братьям и сестрам, которые они содержат. (Вам также может потребоваться принять во внимание фасонные окна - они используют SetWindowRgn, чтобы придать им неправильную форму; в наши дни они довольно редки, когда многоуровневые окна выполняют одну и ту же работу.)
-
Кроме того, если вам не нужны невидимые окна, рассмотрите возможность использования одного из API доступа: они уже выполняют аналогичную работу с этим. Используйте AutomationElement.FromPoint, и вы можете получить элемент пользовательского интерфейса «в этот момент». Это замечательно, если вы действительно заботитесь об интерфейсе пользователя, а не о HWND; он вернет объект, представляющий элемент внутри списка, а не весь список HWND, который поможет вам HWND-ориентированный подход - но он не поможет вам со скрытыми окнами.