Скорее всего, скоро я буду работать над несколькими проектами, в которых мне нужно будет взять данные из файла и программно ввести эти данные в другое стороннее (не мое собственное) приложение. Одна проблема: я понятия не имею, как это сделать. Мне нужно будет ввести данные (например, время в табеле учета рабочего времени). Может ли кто-нибудь направить меня в правильном направлении для приобретения этого навыка?
ДОПОЛНИТЕЛЬНЫЕ ХАРАКТЕРИСТИКИ: я написал исходный пост поздно ночью, поэтому, возможно, он не был таким подробным, как должен. Вот пример: у моего клиента есть приложение ERP, которое он использует для сбора отметок времени от линейных рабочих, когда они выполняют свою работу и выносят проекты за дверь в течение дня. У этого приложения НЕТ API, который я могу использовать для ввода данных. Я слышал о парне, который мог программно выводить данные на экран в окнах и элементах управления этого приложения, так что данные можно было собирать, скажем, в лист Excel, а затем эффективно загружать в это приложение. Этакий реверс экрана-царапины. Это не очень похоже на API, но работает.
Я видел, как приложение взаимодействует с другими приложениями аналогичным образом. Я могу вспомнить один хороший пример - SnagIt, утилиту для создания снимков экрана. Вы можете приказать ему сделать снимок экрана в конкретном приложении, и, когда вы перемещаете указатель мыши по этому окну, элементы управления под указателем будут выделены красным, чтобы указать, какой элемент управления он будет захватывать для вас. Я думаю, что это интересно, и, вероятно, всего в одном шаге от возможности набрать текст в для такого элемента управления.
Спасибо за комментарии и ответы, я преследую их все.
@Mike: Может, нужно уточнить ваши требования ...
Ответ Фредерика хорош, но, как говорит Митч, вопрос требует более строгих требований.





Различные приложения позволяют управлять ими программно по-разному. Два наиболее распространенных подхода:
1) Некоторые приложения предоставляют аргументы командной строки. Пример:
c:\> someapp.exe arg1 arg2
Вы можете вызывать такие приложения из программы на C++ с помощью такого вызова:
System("C:\\>someapp.exe arg1 arg2");
2) Другие приложения могут предоставлять гораздо более мощные объектно-ориентированные API. Например, Microsoft Excel позволяет вам программировать его, используя само приложение как объект в вашей программе на C#:
Excel.Application excelApp = new Excel.App()
Когда у вас есть объект приложения, вы можете вызывать для него методы для управления его поведением. Вы можете, например, открыть новый файл Excel с последующим вызовом следующим образом:
excelApp.Workbooks.Open("\\Somefile.xls", ...);
Для любого стороннего приложения, которым вы пытаетесь управлять, вам нужно будет прочитать его документацию о том, как оно позволяет вам это делать. Информацию о том, как программировать Excel, например, можно найти в здесь.
Однажды я сделал что-то подобное, когда приложение Windows управлялось веб-приложением. Для этого я использовал много Win32 API. Если ваше приложение похоже, то для начала поищите пульт дистанционного управления Winamp с открытым исходным кодом.
Это может быть очень сложно, если приложение не предназначено для взаимодействия. Вам нужно будет отправлять фиктивные события (например, чтобы сделать вид, будто мышь выполняет определенные действия). Один из способов сделать это - написать драйвер мыши, который не подключается к настоящей мыши. Но, как я уже сказал, это зависит от приложения. Приложения с более крупной базой пользователей часто имеют API-интерфейсы для программного взаимодействия или встроенные возможности сценариев (так что вы можете вроде как заставить приложение использовать ваш код).
Я думаю, что FindWindow и Отправить сообщение - это функции, которые вы хотите использовать в целом.
Или, если вы хотите быть еще более «хакерским», начните читать память программы и напрямую вводите данные. :П
Но это может быть очень сложно и часто вообще не работает из-за того, как программа использует память.
Это не самый красивый способ сделать это, но я видел некоторые приложения, которые используют буфер обмена для подобных вещей. К сожалению, это, вероятно, также потребует ручного вмешательства, поскольку у вас, вероятно, нет способа заставить приложение программно извлекать / передавать в буфер обмена.
Возможно, вы сможете автоматизировать это с помощью сценария AutoIt. Это простой язык сценариев, который скрывает некоторые сложности отправки сообщений окнам и элементам управления.
Это похоже на то, что я имел в виду. Удивительно, но это бесплатное ПО! Если это сработает так, как я надеюсь, пожертвование будет в порядке.
Вы хотите программно вводить данные в графический интерфейс стороннего приложения?