#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() может быть лучшим вариантом.