Как выяснить, что представляет собой общий hWnd?

#c# #windows #winapi #ui-automation

#c# #Windows #winapi #пользовательский интерфейс-автоматизация

Вопрос:

Согласно MSDN, winAPI такие функции, как WindowFromPoint не возвращают все окна верхнего уровня (по крайней мере, пропускают скрытые и отключенные), и тогда нам нужно использовать более гибкие функции, такие как ChildWindowFromPoint .

Однако последняя функция может возвращать не только window, вы можете получить любой дочерний дескриптор элемента управления.

Итак, мой вопрос в том, как я должен различать фактический тип объекта, который у меня есть, его дескриптор, это окно, кнопка, флажок .. и т.д.

Когда я попытался «определить», что такое Window Form, чтобы проверить его вручную (например, если у него есть строка заголовка), границы между разными объектами действительно нечеткие.

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

Наконец, я обнаружил, что Microsoft Automation UI в .Net Framework каким-то образом удается различать объекты, есть какие-либо подсказки, как это делается?. Похоже, что нужно реализовать сложный механизм, который будет сравнивать множество параметров, чтобы проверить, что это такое на самом деле, но тогда как AUI так уверен в том, что он нашел?

Ответ №1:

Итак, мой вопрос в том, как я должен различать фактический тип объекта, который у меня есть, его дескриптор, это окно, кнопка, флажок .. и т.д.

Вы можете вызвать GetClassName для дескриптора окна, чтобы получить текстовое представление класса window . Хотя это может помочь определить стандартные классы управления, это мало помогает для пользовательских классов окон (тех, которые вводятся путем вызова RegisterClassEx ).

Классы окон являются статическими 1, и любое окно определенного класса window может позже изменить некоторые настройки, указанные в шаблоне класса. Чтобы получить актуальную информацию об окне, вы можете вместо этого использовать GetWindowLongPtr .

Я обнаружил, что Microsoft Automation UI в .Net Framework каким-то образом удается различать объекты, есть какие-либо подсказки, как это делается?

Автоматизация пользовательского интерфейса вообще не зависит от дескрипторов окон. Он работает путем проверки и управления доступным деревом, которое реализовано через COM-интерфейсы. Нет строгой связи между собственными дескрипторами окон и доступными объектами (вот почему это работает и для элементов управления без окон, например, используемых большинством браузеров).

как AUI так уверен в том, что он нашел?

Потому что он не учитывает, что возвращают интерфейсы автоматизации пользовательского интерфейса. Они реализованы автором элемента управления, поэтому можно предположить, что это достоверная информация.


1 Это примерно правильно. Вы все еще можете изменить зарегистрированный класс, вызвав SetClassLongPtr .

Комментарии:

1. RealGetWindowClass() может быть лучшим вариантом.