Как получить упорядоченный список элементов графического интерфейса внешнего приложения на c#?
Добрый день!
Я взялся за написание аналога приложения Selenium для виндовс и столкнулся с такой проблемой: как получить необходимый мне элемент GUI внешнего приложения? То есть моя программа запускает внешний .exe файл, отслеживает его и производит без участия пользователя в открывшемся приложении всякие манипуляции по типу: нажми кнопку x, введи текст в поле Y, выбери пункт меню Z. Но я никак не могу понять, каким образом мне получить эти X, Y, и Z?
Только приложения, использующие winapi контролы позволяют отследить эти самые контролы. А это далеко не все приложения. И чем современнее приложение, тем меньше шансов, что контролы в этом приложении используются из winapi.
А если контролы не winapi, то никаким образом ты не получишь контрол, если приложение само не позволяет как-то давать доступ к интерфейсу.
спасибо, теперь всё понял. Буду запихивать всё в трай-кетч, на случай отказа в доступе. Может, подскажите где можно подробнее почитать про Вин-апи, и что именно из него портировать?
mauser128, нет никакого отказа в доступе. Речь о том, что контролов не существует вне приложения. Это именно Windows позволяет получать доступ к контролам (повторяю, если приложение использует эти контролы) через winapi. Всё что винда видит в приложениях, которые НЕ используют её контролы - это только само окно. А контролы в таких приложениях - это просто рисунок, картинка на холсте. И собственные классы (в лучшем случае).
В винде всё есть "окно". По этому ОС так и называется. Каждый нативный контрол в ОС - это окно, которое может быть дочерним для другого окна. Через winapi ты можешь запросить список дочерних окон у любого окна. Почти всегда дочерние окна нативного приложения - это контролы. Поэтому получить их не составляет никакого труда. А вот работать с ними уже сложнее. Но это вообще всё работает ТОЛЬКО ЕСЛИ КОНТРОЛЫ НАТИВНЫЕ. Таких приложений сейчас всё меньше. Например, в приложении Телеграм нет нативных контролов, и ты никак не сможешь получить к ним доступ. Там свои контролы.
беда в том, что элементы могут быть где угодно, приложение делается не для конкретной задачи, а как некий комбайн. Задумка классная, но когда ты не можешь заранее сказать что именно через эту прогу будут тестировать и как будут тестировать, увы не подходит